github.com/hikaru7719/go@v0.0.0-20181025140707-c8b2ac68906a/misc/cgo/test/issue24206.go (about)

     1  // +build amd64,linux
     2  
     3  // Copyright 2018 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  package cgotest
     8  
     9  // Test that C.GoString uses IndexByte in safe manner.
    10  
    11  /*
    12  #include <sys/mman.h>
    13  
    14  // Returns string with null byte at the last valid address
    15  char* dangerousString1() {
    16  	int pageSize = 4096;
    17  	char *data = mmap(0, 2 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
    18  	mprotect(data + pageSize,pageSize,PROT_NONE);
    19  	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
    20  	int i = start;
    21  	for (; i < pageSize; i++) {
    22  	data[i] = 'x';
    23  	}
    24  	data[pageSize -1 ] = 0;
    25  	return data+start;
    26  }
    27  
    28  char* dangerousString2() {
    29  	int pageSize = 4096;
    30  	char *data = mmap(0, 3 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
    31  	mprotect(data + 2 * pageSize,pageSize,PROT_NONE);
    32  	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
    33  	int i = start;
    34  	for (; i < 2 * pageSize; i++) {
    35  	data[i] = 'x';
    36  	}
    37  	data[2*pageSize -1 ] = 0;
    38  	return data+start;
    39  }
    40  */
    41  import "C"
    42  
    43  import (
    44  	"testing"
    45  )
    46  
    47  func test24206(t *testing.T) {
    48  	if l := len(C.GoString(C.dangerousString1())); l != 123 {
    49  		t.Errorf("Incorrect string length - got %d, want 123", l)
    50  	}
    51  	if l := len(C.GoString(C.dangerousString2())); l != 4096+123 {
    52  		t.Errorf("Incorrect string length - got %d, want %d", l, 4096+123)
    53  	}
    54  }