Re: PQconnectdbParams returns exit value 01 (from gdb).
Tom Lane <[email protected]> Mon, 25 Feb 2013 06:13:24 -0500
| Newsgroups | gmane.comp.db.postgresql.interfaces |
|---|---|
| Message-ID | <[email protected]> |
Andrei Petru Mura <[email protected]> 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 -- Sent via pgsql-interfaces mailing list ([email protected]) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-interfaces