Valgrind schreit über nicht initialisierte Bytes

Lesezeit: 3 Minuten

Benutzer-Avatar
Damian Barbati

Valgrind wirft mir diesen Fehler aus:

==11204== Syscall param write(buf) points to uninitialised byte(s)
==11204==    at 0x4109033: write (in /lib/libc-2.13.so)
==11204==    by 0x8049654: main (mmboxman.c:289)
==11204==  Address 0xbe92f861 is on thread 1's stack
==11204== 

Was ist das Problem? Ich kann nicht finden, um welches nicht initialisierte Byte es schreit. Hier sind die kriminellen Codezeilen (die erwähnte 289-Zeile ist diejenige, die die Funktion lockUp aufruft):

Request request;            
Response response;              

fillRequest(&request, MANADDUSER, getpid(), argument1, NULL, NULL, 0, 0);
lockUp(&request, &response, NULL);

Hier der Funktionsprototyp und die Structs-Deklaration:

void fillRequest(Request *request, char code, pid_t pid, char *name1, char *name2, char   *object, int id, size_t size)
{
    int k;

    request->code = code;
    request->pid = getpid();

    if(name1)    for(k=0; k<strlen(name1)+1; k++)   request->name1[k] = name1[k];
    else         request->name1[0] = '\0';

    if(name2)    for(k=0; k<strlen(name2)+1; k++)   request->name2[k] = name2[k];
    else         request->name2[0] = '\0';  

    if(object)   for(k=0; k<strlen(name2)+1; k++)   request->name2[k] = name2[k];
    else         request->object[0] = '\0'; 

    request->id    = id;
    request->size = size;
}

void lockUp(Request *request, Response *response, void **buffer)
{
    int fifofrom, fifoto, lock;     /* file descriptor delle fifo e del lock */

    /* locko per l'accesso alle FIFO */
    if((lock = open(LOCK, O_RDONLY)) == -1)   logMmboxman("error in opening LOCK\n", 1);
    else                                      logMmboxman("opened LOCK\n", 0);

    if(flock(lock, LOCK_EX) == -1)            logMmboxman("error in acquiring LOCK\n", 1);              
    else                                              logMmboxman("acquired LOCK\n", 0);  

    /* apro la fifoto e scrivo la mia richiesta */
    if((fifoto = open(FIFOTOMMBOXD, O_WRONLY)) == -1)   logMmboxman("error in opening FIFOTO\n", 1); 
    else                                                logMmboxman("opened FIFOTO\n", 0);  

    if((write(fifoto, request, sizeof(Request))) != sizeof(Request))   logMmboxman("error in writing FIFOTO\n", 1);
    else                                                               logMmboxman("written on FIFOTO\n", 0);
    close(fifoto);

    /* rimango in attesa della risposta da mmboxd sulla fifofrom */
    if((fifofrom = open(FIFOFROMMMBOXD, O_RDONLY)) == -1)   logMmboxman("error in opening FIFOFROM\n", 1);
    else                                                    logMmboxman("opened FIFOFROM\n", 0);

    if((read(fifofrom, response, sizeof(Response))) != sizeof(Response))   logMmboxman("error in reading FIFOFROM\n", 1);
    else                                                                   logMmboxman("read from FIFOFROM\n", 0);
    close(fifofrom);

    /* se mi deve comunicare un buffer riapro la fifo e lo leggo */
    if(response->size)
    {
            if((fifofrom = open(FIFOFROMMMBOXD, O_RDONLY)) == -1)   logMmboxman("error in opening FIFOFROM again for the buffer\n", 1);
            else                                                    logMmboxman("opened FIFOFROM again for the buffer\n", 0);

            *buffer = (void*)malloc(response->size);

            if(read(fifofrom, *buffer, response->size) != response->size)   logMmboxman("error in reading FIFOFROM again for the buffer\n", 1);
            else                                                            logMmboxman("read from FIFOFROM again for the buffer\n", 0);
            close(fifofrom);    
    }

    /* letta la risposta rilascio il lock */
    if(flock(lock, LOCK_UN) == -1)            logMmboxman("error in releasing LOCK\n", 1);              
    else                                      logMmboxman("released LOCK\n", 0);  

    return;
}

typedef struct 
{
    char code;          
    pid_t pid;          
    char name1[41];     
    char name2[41];     
    char object[101];   
    int id;             
    size_t size;        
} Request;

typedef struct 
{
    char result;    
    int num;        
    int num2;   
    size_t size;    
} Response;

Benutzer-Avatar
zwischenjay

Dein Request Struktur hat Arrays name1, name2, usw., die nullterminierte Zeichenfolgen enthalten. Wenn Sie sie füllen, schreiben Sie nicht über das Null-Terminator hinaus. Später, wenn Sie die Struktur in die Datei schreiben, beschwert sich Valgrind, weil diese Bytes nicht initialisiert sind. Es können auch andere nicht initialisierte Bytes vorhanden sein (z. B. vom Compiler eingefügte Auffüllungen).

Dies ist nicht unbedingt ein Problem, abgesehen von einem kleinen Sicherheitsproblem: Der vorherige Inhalt des Speichers, der möglicherweise vertrauliche Informationen enthält, wird in die Datei geschrieben.

Sie können die Struktur auf 0 setzen, bevor Sie ihre Felder füllen, um diesen Fehler zu vermeiden.

  • Dies ist eigentlich der einzige Ort, an dem strncpy ist die richtige Lösung – diese Art von Situation ist genau wofür es geschaffen wurde.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    30. April 2011 um 21:46 Uhr

1371460cookie-checkValgrind schreit über nicht initialisierte Bytes

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy