"We are back" « oc.at

[*nix-c] getpwuid verursacht mem corruption?

EvilGohan 29.03.2011 - 00:06 1180 0
Posts

EG

thinking with portals
Avatar
Registered: May 2004
Location: 11**
Posts: 3918
Hey Jungs,

ich sitz wohl einfach schon zu lang vorm Code...eine für mich scheinbar komplett unkritische Zeile wirft den tracer an... :(

Die Funktion holt sich mit getpwuid über die UID eine Struktur in der man auf den Namen eines Users als String auslesen kann.
Dieser String wird dann zurück gegeben.

Die Funktion klappt solange einwandfrei bis der Ordnername länger als 27 Zeichen oder länger ist!? O.o

edit: ganz vergessen...der Hintergrund!
Das Programm vollzieht "ls -l" nach. Ich hol mir über stat() eine Struktur aus der ich die uid bekomm. Mit der uid hol ich mir dann über getpwuid den Usernamen für die Ausgabe.

Die übergebene uid ist korrekt gesetzt. Gecheckt im Debugger.

Code:
char* get_username(uid_t uid)
{   
    struct passwd *pw = NULL;			// passwd struct (user protperties)

    if((pw = getpwuid(uid)) != NULL)   	// get data from /etc/passwd
	{
		return pw->pw_name;				// return username to given uid
    }

	return NULL;						// in case no username could be extracted
}  

So knallts:

Code:
*** glibc detected *** /home/tom/workspace/myls/Debug/myls: free(): invalid next size (normal): 0x000000000060ee90 ***
======= Backtrace: =========
/lib/libc.so.6(+0x774b6)[0x7ffff7ad04b6]
/lib/libc.so.6(cfree+0x73)[0x7ffff7ad6c83]
/lib/libc.so.6(fclose+0x14d)[0x7ffff7ac09ed]
/lib/libnss_compat.so.2(_nss_compat_getpwuid_r+0xc5)[0x7ffff7854145]
/lib/libc.so.6(getpwuid_r+0xdd)[0x7ffff7b0258d]
/lib/libc.so.6(getpwuid+0x6f)[0x7ffff7b01e7f]
/home/tom/workspace/myls/Debug/myls[0x4011f2]
/home/tom/workspace/myls/Debug/myls[0x401682]
/home/tom/workspace/myls/Debug/myls[0x401168]
/home/tom/workspace/myls/Debug/myls[0x400e28]
/lib/libc.so.6(__libc_start_main+0xfe)[0x7ffff7a77d8e]
/home/tom/workspace/myls/Debug/myls[0x400be9]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:01 137775                             /home/tom/workspace/myls/Debug/myls
00602000-00603000 r--p 00002000 08:01 137775                             /home/tom/workspace/myls/Debug/myls
00603000-00604000 rw-p 00003000 08:01 137775                             /home/tom/workspace/myls/Debug/myls
00604000-0062d000 rw-p 00000000 00:00 0                                  [heap]
7ffff0000000-7ffff0021000 rw-p 00000000 00:00 0 
7ffff0021000-7ffff4000000 ---p 00000000 00:00 0 
7ffff7008000-7ffff701d000 r-xp 00000000 08:01 131153                     /lib/libgcc_s.so.1
7ffff701d000-7ffff721c000 ---p 00015000 08:01 131153                     /lib/libgcc_s.so.1
7ffff721c000-7ffff721d000 r--p 00014000 08:01 131153                     /lib/libgcc_s.so.1
7ffff721d000-7ffff721e000 rw-p 00015000 08:01 131153                     /lib/libgcc_s.so.1
7ffff721e000-7ffff722a000 r-xp 00000000 08:01 131185                     /lib/libnss_files-2.12.1.so
7ffff722a000-7ffff7429000 ---p 0000c000 08:01 131185                     /lib/libnss_files-2.12.1.so
7ffff7429000-7ffff742a000 r--p 0000b000 08:01 131185                     /lib/libnss_files-2.12.1.so
7ffff742a000-7ffff742b000 rw-p 0000c000 08:01 131185                     /lib/libnss_files-2.12.1.so
7ffff742b000-7ffff7435000 r-xp 00000000 08:01 131195                     /lib/libnss_nis-2.12.1.so
7ffff7435000-7ffff7634000 ---p 0000a000 08:01 131195                     /lib/libnss_nis-2.12.1.so
7ffff7634000-7ffff7635000 r--p 00009000 08:01 131195                     /lib/libnss_nis-2.12.1.so
7ffff7635000-7ffff7636000 rw-p 0000a000 08:01 131195                     /lib/libnss_nis-2.12.1.so
7ffff7636000-7ffff764d000 r-xp 00000000 08:01 131179                     /lib/libnsl-2.12.1.so
7ffff764d000-7ffff784c000 ---p 00017000 08:01 131179                     /lib/libnsl-2.12.1.so
7ffff784c000-7ffff784d000 r--p 00016000 08:01 131179                     /lib/libnsl-2.12.1.so
7ffff784d000-7ffff784e000 rw-p 00017000 08:01 131179                     /lib/libnsl-2.12.1.so
7ffff784e000-7ffff7850000 rw-p 00000000 00:00 0 
7ffff7850000-7ffff7858000 r-xp 00000000 08:01 131181                     /lib/libnss_compat-2.12.1.so
7ffff7858000-7ffff7a57000 ---p 00008000 08:01 131181                     /lib/libnss_compat-2.12.1.so
7ffff7a57000-7ffff7a58000 r--p 00007000 08:01 131181                     /lib/libnss_compat-2.12.1.so
7ffff7a58000-7ffff7a59000 rw-p 00008000 08:01 131181                     /lib/libnss_compat-2.12.1.so
7ffff7a59000-7ffff7bd3000 r-xp 00000000 08:01 131119                     /lib/libc-2.12.1.so
7ffff7bd3000-7ffff7dd2000 ---p 0017a000 08:01 131119                     /lib/libc-2.12.1.so
7ffff7dd2000-7ffff7dd6000 r--p 00179000 08:01 131119                     /lib/libc-2.12.1.so
7ffff7dd6000-7ffff7dd7000 rw-p 0017d000 08:01 131119                     /lib/libc-2.12.1.so
7ffff7dd7000-7ffff7ddc000 rw-p 00000000 00:00 0 
7ffff7ddc000-7ffff7dfc000 r-xp 00000000 08:01 131095                     /lib/ld-2.12.1.so
7ffff7fe9000-7ffff7fec000 rw-p 00000000 00:00 0 
7ffff7ff8000-7ffff7ffb000 rw-p 00000000 00:00 0 
7ffff7ffb000-7ffff7ffc000 r-xp 00000000 00:00 0                          [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00020000 08:01 131095                     /lib/ld-2.12.1.so
7ffff7ffd000-7ffff7ffe000 rw-p 00021000 08:01 131095                     /lib/ld-2.12.1.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0 
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

edit:
Hab an anderer Stelle in einen unüberprüften Übergabewert geschrieben...jetzt klappts! :)
Bearbeitet von EG am 29.03.2011, 01:25
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz