Hey Ken,

I found some bugs in pbm2ap.c which caused it to core dump. (Using file
descriptors after fclose(), using a pointer uninitialized).

```diff
--- pbm2ap.c.orig 2024-08-07 01:14:02.873843472 -0700
+++ pbm2ap.c 2024-08-07 02:25:16.119954682 -0700
@@ -953,10 +953,10 @@
 /*
 
===================================================================================
 Open and read the PBM file, parse the header and determine the image
geometry.
-Also return the pointer to the first byte of data.
+Returns true if successful.
 
===================================================================================
 */
-FILE* open_pbm_file(char *filename, long *x, long* y, char** dataptr,
char** endptr)
+int open_pbm_file(char *filename, long *x, long* y, char** dataptr, char**
endptr)
 {
     FILE*   in;
     char *  data, *ptr;
@@ -965,7 +965,7 @@
     if ((in = fopen(filename, "rb")) == NULL)
     {
         printf("unable to open %s\n", filename);
-        return NULL;
+        return 0;
     }

     /* Read the input data */
@@ -980,8 +980,7 @@
     if (data[0] != 'P' || data[1] != '4')
     {
         printf("Invalid input format\n");
-        fclose(in);
-        return NULL;
+        return 0;
     }

     /* Test for file comment */
@@ -1011,7 +1010,7 @@
     *dataptr = ptr;
     *endptr = ptr + *y*(*x+7)/8;

-    return in;
+    return 1;
 }

 /*
@@ -1021,9 +1020,7 @@
 */
 int main(int argc, char* argv[])
 {
-    FILE*   in;
     FILE*   out;
-    FILE*   maskfd;
     long    x, y, outx, outy;
     char *  maskfile = NULL;
     char    *data_ptr, *data_endptr;
@@ -1032,7 +1029,7 @@
     int     opt;
     int     size[5];

-    char    *mask_ptr, *mask_endptr;
+    char    *mask_ptr=NULL, *mask_endptr=NULL;
     long    mask_x, mask_y;

     while ((opt = getopt(argc, argv, "m:orsuv")) != -1)
@@ -1075,31 +1072,31 @@
     }


-     if (optind+1 >= argc)
-     {
-         fprintf(stderr, "Usage: %s [-rsuv] infile outfile\n", argv[0]);
-         fprintf(stderr, "\n");
-         fprintf(stderr, "       -r   Encode for OptROM.  Uses ALL bytes
0-FFh\n");
-         fprintf(stderr, "               Not suitable for use with
BASIC\n\n");
-         fprintf(stderr, "       -s   Perform silent conversion\n\n");
-         fprintf(stderr, "       -u   Encode using upper ASCII bytes
80h-FFh also\n\n");
-         fprintf(stderr, "       -v   Be verbose during the
conversion\n\n");
-         exit(EXIT_FAILURE);
-     }
+    if (optind+1 >= argc)
+    {
+        fprintf(stderr, "Usage: %s [-rsuv] [-m maskfile] infile
outfile\n", argv[0]);
+        fprintf(stderr, "\n");
+        fprintf(stderr, "       -m   Mask file\n");
+        fprintf(stderr, "       -r   Encode for OptROM.  Uses ALL bytes
0-FFh\n");
+        fprintf(stderr, "               Not suitable for use with
BASIC\n\n");
+        fprintf(stderr, "       -s   Perform silent conversion\n\n");
+        fprintf(stderr, "       -u   Encode using upper ASCII bytes
80h-FFh also\n\n");
+        fprintf(stderr, "       -v   Be verbose during the
conversion\n\n");
+        exit(EXIT_FAILURE);
+    }

     // Open the input file
-    if ((in = open_pbm_file(argv[optind], &x, &y, &data_ptr,
&data_endptr)) == NULL)
+    if (!open_pbm_file(argv[optind], &x, &y, &data_ptr, &data_endptr))
     {
+        fprintf(stderr, "Unable to open file '%s'\n", argv[optind]);
         return 1;
     }

     // If a mask file given, try to open it
     if (maskfile)
     {
-        maskfd = open_pbm_file(maskfile, &mask_x, &mask_y, &mask_ptr,
&mask_endptr);
-
         // Validate we can open the maskfile
-        if (maskfd == NULL)
+        if (!open_pbm_file(maskfile, &mask_x, &mask_y, &mask_ptr,
&mask_endptr))
         {
             fprintf(stderr, "Unable to open mask file %s\n", maskfile);
             return 1;
@@ -1130,7 +1127,6 @@
             if ((out = fopen(argv[optind + 1], "wb+")) == NULL)
             {
                 printf("unable to open %s\n", argv[optind + 1]);
-                fclose(in);
                 return 1;
             }
```

—b9

On Tue, Aug 6, 2024 at 8:08 AM Kenneth Pettit <[email protected]> wrote:

> On 8/6/24 7:46 AM, Joshua O'Keefe wrote:
>
> On Aug 6, 2024, at 5:33 AM, Kenneth Pettit <[email protected]>
> <[email protected]> wrote:
>
> mask = ~(0x01 << data);
>
>
> Wow, Ken, it's amazing how you can just zoom right into a spot in the code
> and find this so quickly based on the bug description. That's the sign of a
> man who knows his codebase well...
>
>
> Thanks Joshua, though it was B 9's image that told me *exactly* what the
> problem was and where to look. :)  Seeing the triangle patterns, it was
> clear the code was clearing too many bits (pixels) from the emulated LCD
> RAM byte.
>
> Ken
>
>

Reply via email to