On 2 January 2012 06:58, Henning Brauer <[email protected]> wrote:
> what next? having pfctl whine about an empty config file?
>
> * Stephane A. Sezer <[email protected]> [2012-01-02 09:36]:
>> Hi,
>>
>> I found a strange behavior in pfctl(8) which looks like a bug.
>>
>> When given a directory as input (either with the `-f` flag, or with the
>> `include` directive in a config file), pfctl(8) does not emit any
>> warning and silently accepts the given input.
>>
>> I suppose this is not the intended behavior so here is a patch that
>> fixes the issue.


Even if it is the case, testing against directory doesn't seem like
the right thing, the test should be done against a regular file, what
if you pass a block device ? another check ?

You're only dealing with a very special case here, anyway, I agree
with Henning, it seems too much.

>>
>> Regards,
>>
>> --
>> Stephane A. Sezer
>>
>> Index: sbin/pfctl/parse.y
>> ===================================================================
>> RCS file: /cvs/src/sbin/pfctl/parse.y,v
>> retrieving revision 1.613
>> diff -u -r1.613 parse.y
>> --- sbin/pfctl/parse.y        19 Dec 2011 23:26:16 -0000      1.613
>> +++ sbin/pfctl/parse.y        2 Jan 2012 08:04:12 -0000
>> @@ -5614,37 +5614,52 @@
>>  pushfile(const char *name, int secret)
>>  {
>>       struct file     *nfile;
>> +     struct stat     sb;
>>
>> -     if ((nfile = calloc(1, sizeof(struct file))) == NULL ||
>> -         (nfile->name = strdup(name)) == NULL) {
>> -             if (nfile)
>> -                     free(nfile);
>> -             warn("malloc");
>> -             return (NULL);
>> +     if ((nfile = calloc(1, sizeof(struct file))) == NULL) {
>> +             warn("calloc");
>> +             goto err;
>>       }
>> -     if (TAILQ_FIRST(&files) == NULL && strcmp(nfile->name, "-") == 0) {
>> +
>> +     if (TAILQ_FIRST(&files) == NULL && strcmp(name, "-") == 0) {
>>               nfile->stream = stdin;
>> -             free(nfile->name);
>>               if ((nfile->name = strdup("stdin")) == NULL) {
>>                       warn("strdup");
>> -                     free(nfile);
>> -                     return (NULL);
>> +                     goto err;
>> +             }
>> +     } else {
>> +             if ((nfile->name = strdup(name)) == NULL) {
>> +                     warn("strdup");
>> +                     goto err;
>> +             }
>> +             if ((nfile->stream = fopen(nfile->name, "r")) == NULL) {
>> +                     warn("%s", nfile->name);
>> +                     goto err;
>> +             }
>> +             if (secret &&
>> +                 check_file_secrecy(fileno(nfile->stream), nfile->name))
>> +                     goto file_err;
>> +             if (fstat(fileno(nfile->stream), &sb) == -1) {
>> +                     warn("fstat");
>> +                     goto file_err;
>> +             }
>> +             if (S_ISDIR(sb.st_mode)) {
>> +                     errno = EISDIR;
>> +                     warn("%s", nfile->name);
>> +                     goto file_err;
>>               }
>> -     } else if ((nfile->stream = fopen(nfile->name, "r")) == NULL) {
>> -             warn("%s", nfile->name);
>> -             free(nfile->name);
>> -             free(nfile);
>> -             return (NULL);
>> -     } else if (secret &&
>> -         check_file_secrecy(fileno(nfile->stream), nfile->name)) {
>> -             fclose(nfile->stream);
>> -             free(nfile->name);
>> -             free(nfile);
>> -             return (NULL);
>>       }
>> +
>>       nfile->lineno = 1;
>>       TAILQ_INSERT_TAIL(&files, nfile, entry);
>>       return (nfile);
>> +
>> +file_err:
>> +     fclose(nfile->stream);
>> +err:
>> +     free(nfile->name);
>> +     free(nfile);
>> +     return (NULL);
>>  }
>>
>>  int
>>
>
> --
> Henning Brauer, [email protected], [email protected]
> BS Web Services, http://bsws.de, Full-Service ISP
> Secure Hosting, Mail and DNS Services. Dedicated Servers, Root to Fully
Managed
> Henning Brauer Consulting, http://henningbrauer.com/

Reply via email to