Re: PQconnectdbParams returns exit value 01 (from gdb).
От | Tom Lane |
---|---|
Тема | Re: PQconnectdbParams returns exit value 01 (from gdb). |
Дата | |
Msg-id | 19857.1361790804@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | PQconnectdbParams returns exit value 01 (from gdb). (Andrei Petru Mura <mapandrei@gmail.com>) |
Список | pgsql-interfaces |
Andrei Petru Mura <mapandrei@gmail.com> writes: > I'm trying to create a connection to my database with libpq. Bellow is my > code: > keywords = malloc(6 * sizeof(char *)); > values = malloc(6 * sizeof(char *)); That looks less than safe ... what happens if you have more than five lines in the creds file? > while (fgets(line, LINE_SIZE, creds) != NULL) { > if (line[strlen(line) - 1] == '\n') > line[strlen(line) - 1] = '\0'; > prop = line; > while(*(prop++) != '=') { > i++; > } > tmp = prop; > prop = malloc(i + 1); > strncpy(prop, line, i); > prop[i] = '\0'; > keywords[j++] = prop; > val = malloc(strlen(line) - strlen(prop) + 1); > strcpy(val, tmp); > values[k++] = val; > i = 0; > } This has got a few issues, like it'll die badly if there's no '=' in a line, and not behave too well if a line overruns the fixed buffer length. > keywords[++j] = NULL; > values[++k] = NULL; But your real problem is here, where you're leaving undefined holes in the arrays. These should be j++ and k++, not ++j and ++k. If malloc doesn't give you back all-zeroes storage, PQconnectdbParams will be led to try to dereference garbage pointer values, resulting in your SIGSEGVs. regards, tom lane
В списке pgsql-interfaces по дате отправления: