From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Andrei Petru Mura <mapandrei(at)gmail(dot)com> |
Cc: | pgsql-interfaces(at)postgresql(dot)org |
Subject: | Re: PQconnectdbParams returns exit value 01 (from gdb). |
Date: | 2013-02-25 11:13:24 |
Message-ID: | 19857.1361790804@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-interfaces |
Andrei Petru Mura <mapandrei(at)gmail(dot)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
From | Date | Subject | |
---|---|---|---|
Next Message | Pedro Ferro | 2013-02-28 15:25:22 | Informix to Postgresql via DBI-Link |
Previous Message | Andrei Petru Mura | 2013-02-25 10:42:10 | PQconnectdbParams returns exit value 01 (from gdb). |