Changeset 17605 in niluje


Ignore:
Timestamp:
Jul 30, 2020, 7:58:16 PM (12 days ago)
Author:
NiLuJe
Message:

MobiCover:

  • More realpath cleanups
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Configs/trunk/Kindle/Touch_Hacks/MobiCover/LibMobi/mobicover.c

    r17604 r17605  
    269269                                              { NULL, 0, NULL, 0 } };
    270270
    271         bool  errfnd = false;
    272         char  _outdir[PATH_MAX];
     271        bool  errfnd       = false;
    273272        char* outdir       = NULL;
    274273        bool  do_typecheck = false;
     274
     275        // Assume success, until shit happens ;)
     276        int rv = EXIT_SUCCESS;
    275277
    276278        while ((opt = getopt_long(argc, argv, "o:hk", opts, &opt_index)) != -1) {
     
    278280                        case 'o':
    279281                                // Only deal with canonical paths
    280                                 if (realpath(optarg, _outdir) == NULL) {
     282                                outdir = realpath(optarg, outdir);
     283                                if (outdir == NULL) {
    281284                                        fprintf(stderr,
    282285                                                "Unable to resolve output directory path `%s` (realpath: %m)!\n",
    283286                                                optarg);
    284                                         return ERRCODE(EXIT_FAILURE);
     287                                        rv = ERRCODE(EXIT_FAILURE);
     288                                        goto cleanup;
    285289                                }
    286                                 outdir = _outdir;
    287290                                break;
    288291                        case 'k':
     
    305308        }
    306309
    307         // Assume success, until shit happens ;)
    308         int rv = EXIT_SUCCESS;
    309 
    310310        if (optind < argc) {
    311311                while (optind < argc) {
    312                         char* inarg = argv[optind++];
     312                        char* inarg  = argv[optind++];
     313                        char* infile = NULL;
     314                        infile       = realpath(inarg, infile);
    313315                        // Only deal with canonical paths
    314                         char infile[PATH_MAX];
    315                         if (realpath(inarg, infile) == NULL) {
     316                        if (infile == NULL) {
    316317                                fprintf(stderr, "Unable to resolve input file's path `%s` (realpath: %m)!\n", inarg);
    317                                 return ERRCODE(EXIT_FAILURE);
     318                                free(infile);
     319                                rv = ERRCODE(EXIT_FAILURE);
     320                                goto cleanup;
    318321                        }
    319322
     
    326329                                            strncasecmp(infile + (namelen - 5), ".pobi", 5) != 0)) {
    327330                                fprintf(stderr, "Input file `%s` is not a Kindle/Mobipocket eBook.\n", infile);
    328                                 return ERRCODE(EXIT_FAILURE);
     331                                free(infile);
     332                                rv = ERRCODE(EXIT_FAILURE);
     333                                goto cleanup;
    329334                        }
    330335
     
    335340                        if (m == NULL) {
    336341                                fprintf(stderr, "Memory allocation failed\n");
    337                                 return ERRCODE(EXIT_FAILURE);
     342                                free(infile);
     343                                rv = ERRCODE(EXIT_FAILURE);
     344                                goto cleanup;
    338345                        }
    339346
     
    343350                                fprintf(stderr, "Error opening file: %s (fopen: %m)\n", infile);
    344351                                mobi_free(m);
    345                                 return ERRCODE(EXIT_FAILURE);
     352                                free(infile);
     353                                rv = ERRCODE(EXIT_FAILURE);
     354                                goto cleanup;
    346355                        }
    347356
     
    353362                                fprintf(stderr, "Error while loading document: %s\n", libmobi_msg(mobi_ret));
    354363                                mobi_free(m);
    355                                 return ERRCODE(EXIT_FAILURE);
     364                                free(infile);
     365                                rv = ERRCODE(EXIT_FAILURE);
     366                                goto cleanup;
    356367                        }
    357368
     
    362373                                        fprintf(stderr, "Input file `%s` is a dictionary!\n", infile);
    363374                                        mobi_free(m);
    364                                         return ERRCODE(EXIT_FAILURE);
     375                                        free(infile);
     376                                        rv = ERRCODE(EXIT_FAILURE);
     377                                        goto cleanup;
    365378                                }
    366379
     
    370383                                        fprintf(stderr, "No CDE Type in EXTH for input file `%s`!\n", infile);
    371384                                        mobi_free(m);
    372                                         return ERRCODE(EXIT_FAILURE);
     385                                        free(infile);
     386                                        rv = ERRCODE(EXIT_FAILURE);
     387                                        goto cleanup;
    373388                                } else {
    374389                                        char* cde_type = mobi_decode_exthstring(m, exth->data, exth->size);
     
    379394                                                free(cde_type);
    380395                                                mobi_free(m);
    381                                                 return ERRCODE(EXIT_FAILURE);
     396                                                free(infile);
     397                                                rv = ERRCODE(EXIT_FAILURE);
     398                                                goto cleanup;
    382399                                        } else {
    383400                                                if (strcmp(cde_type, "EBOK") != 0 && strcmp(cde_type, "PDOC") != 0) {
     
    388405                                                        free(cde_type);
    389406                                                        mobi_free(m);
    390                                                         return ERRCODE(EXIT_FAILURE);
     407                                                        free(infile);
     408                                                        rv = ERRCODE(EXIT_FAILURE);
     409                                                        goto cleanup;
    391410                                                }
    392411                                                // Do we want to parse periodicals, too?
     
    399418                                                                free(cde_type);
    400419                                                                mobi_free(m);
    401                                                                 return ERRCODE(EXIT_FAILURE);
     420                                                                free(infile);
     421                                                                rv = ERRCODE(EXIT_FAILURE);
     422                                                                goto cleanup;
    402423                                                        }
    403424                                                }
     
    410431                        rv = dump_cover(m, infile, outdir);
    411432                        mobi_free(m);
     433                        free(infile);
     434
    412435                        if (rv != EXIT_SUCCESS) {
    413436                                fprintf(stderr, "Failed to dump cover for file: %s\n", infile);
    414                                 return ERRCODE(EXIT_FAILURE);
     437                                rv = ERRCODE(EXIT_FAILURE);
     438                                goto cleanup;
    415439                        }
    416440                }
    417441        } else {
    418442                show_helpmsg();
    419                 return ERRCODE(EXIT_FAILURE);
    420         }
     443                rv = ERRCODE(EXIT_FAILURE);
     444                goto cleanup;
     445        }
     446
     447cleanup:
     448        free(outdir);
    421449
    422450        return rv;
Note: See TracChangeset for help on using the changeset viewer.