gettimeofday segfaults with malloc but not calloc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I'm using gettimeofday to get the most accurate time from the kernel

When I use calloc to create and initalize memory for the struct timeval *tv, 
everything works fine: 

struct timeval *tv;
tv = (struct timeval *)calloc(1, sizeof(struct timeval));
if (!tv) {
  /* handle error... */
  exit
}
gettimeofday(tv);

But, when I use malloc, gettimeofday segfaults, even though tv != NULL, and I 
can set tv_sec and tv_usec manually without getting a segfault. Normally I'm 
able to figure these kind of things out, but right now, I'm stuck. Especially 
as it works if I use calloc and gettimeofday on a separate struct, or, if i 
print the address of the malloc'ed timeval.

strace of program: 

execve("./test_time", ["./test_time"], [/* 49 vars */]) = 0
brk(0)                                  = 0x2330000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x7f42ca271000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or 
directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x7f42ca26f000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or 
directory)
open("tls/x86_64/libc.so.6", O_RDONLY)  = -1 ENOENT (No such file or 
directory)
open("tls/libc.so.6", O_RDONLY)         = -1 ENOENT (No such file or 
directory)
open("x86_64/libc.s#include <stdio.h>
#include <stdlib.h>

/* 
 * struct timeval {
 *	time_t      tv_sec;
 *	suseconds_t tv_usec;
 * };
 */

void gettime_1(void)
{
	struct timeval *tv;
	tv = (struct timeval *)malloc(1*sizeof (struct timeval));
	if (!tv) {
		fprintf(stderr, "Could not allocate memory for timestruct\n");
		return;
	}
	gettimeofday(tv);
	printf("Time1: %lu, %lu\n", (long unsigned)tv->tv_sec, (long unsigned)tv-
>tv_usec);
}
void gettime_2(void)
{
	struct timeval *tv;
	tv = (struct timeval *)calloc(1,sizeof (struct timeval));
	if (!tv) {
		fprintf(stderr, "Could not allocate memory for timestruct\n");
		return;
	}
	gettimeofday(tv);
	printf("Time2: %lu, %lu\n", (long unsigned)tv->tv_sec, (long unsigned)tv-
>tv_usec);
}
int main (int argc, char *argv[])
{
	gettime_1();	
	gettime_2();
	return 0;
}
o.6", O_RDONLY)      = -1 ENOENT (No such file or directory)
open("libc.so.6", O_RDONLY)             = -1 ENOENT (No such file or 
directory)
open("/usr/lib32/tls/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or 
directory)
stat("/usr/lib32/tls/x86_64", 0x7fffd226fb20) = -1 ENOENT (No such file or 
directory)
open("/usr/lib32/tls/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or 
directory)
stat("/usr/lib32/tls", 0x7fffd226fb20)  = -1 ENOENT (No such file or 
directory)
open("/usr/lib32/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or 
directory)
stat("/usr/lib32/x86_64", 0x7fffd226fb20) = -1 ENOENT (No such file or 
directory)
open("/usr/lib32/libc.so.6", O_RDONLY)  = -1 ENOENT (No such file or 
directory)
stat("/usr/lib32", {st_mode=S_IFDIR|0755, st_size=36864, ...}) = 0
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=115573, ...}) = 0
mmap(NULL, 115573, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f42ca252000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or 
directory)
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\345"..., 832) = 
832
fstat(3, {st_mode=S_IFREG|0755, st_size=1502520, ...}) = 0
mmap(NULL, 3609304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 
0x7f42c9ce2000
mprotect(0x7f42c9e4b000, 2093056, PROT_NONE) = 0
mmap(0x7f42ca04a000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|
MAP_DENYWRITE, 3, 0x168000) = 0x7f42ca04a000
mmap(0x7f42ca04f000, 17112, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|
MAP_ANONYMOUS, -1, 0) = 0x7f42ca04f000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x7f42ca251000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x7f42ca250000
arch_prctl(ARCH_SET_FS, 0x7f42ca2506e0) = 0
mprotect(0x7f42ca04a000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ)     = 0
mprotect(0x7f42ca272000, 4096, PROT_READ) = 0
munmap(0x7f42ca252000, 115573)          = 0
brk(0)                                  = 0x2330000
brk(0x2351000)                          = 0x2351000
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Process 9387 detached


The program itself (note the usage of gettime_1 and gettime_2 (if I call 
gettime_2 before gettime_1, it works, if I call gettime_1 first, it 
segfaults).

#include <stdio.h>
#include <stdlib.h>

/* 
 * struct timeval {
 *	time_t      tv_sec;
 *	suseconds_t tv_usec;
 * };
 */

void gettime_1(void)
{
	struct timeval *tv;
	tv = (struct timeval *)malloc(1*sizeof (struct timeval));
	if (!tv) {
		fprintf(stderr, "Could not allocate memory for timestruct\n");
		return;
	}
	gettimeofday(tv);
	printf("Time1: %lu, %lu\n", (long unsigned)tv->tv_sec, (long unsigned)tv-
>tv_usec);
}
void gettime_2(void)
{
	struct timeval *tv;
	tv = (struct timeval *)calloc(1,sizeof (struct timeval));
	if (!tv) {
		fprintf(stderr, "Could not allocate memory for timestruct\n");
		return;
	}
	gettimeofday(tv);
	printf("Time2: %lu, %lu\n", (long unsigned)tv->tv_sec, (long unsigned)tv-
>tv_usec);
}
int main (int argc, char *argv[])
{
	gettime_1();	
	gettime_2();
	return 0;
}


Any help appreciated :-)

-- 
Henrik

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux