Changeset 17606 in niluje


Ignore:
Timestamp:
Jul 30, 2020, 8:06:59 PM (9 days ago)
Author:
NiLuJe
Message:

MobiCover:

  • More error-handling cleanup
File:
1 edited

Legend:

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

    r17605 r17606  
    272272        char* outdir       = NULL;
    273273        bool  do_typecheck = false;
     274
     275        // Early declare to make error-handling less clunky
     276        char*     infile   = NULL;
     277        MOBIData* m        = NULL;
     278        char*     cde_type = NULL;
    274279
    275280        // Assume success, until shit happens ;)
     
    310315        if (optind < argc) {
    311316                while (optind < argc) {
    312                         char* inarg  = argv[optind++];
    313                         char* infile = NULL;
    314                         infile       = realpath(inarg, infile);
     317                        char* inarg = argv[optind++];
     318                        infile      = realpath(inarg, infile);
    315319                        // Only deal with canonical paths
    316320                        if (infile == NULL) {
    317321                                fprintf(stderr, "Unable to resolve input file's path `%s` (realpath: %m)!\n", inarg);
    318                                 free(infile);
    319322                                rv = ERRCODE(EXIT_FAILURE);
    320323                                goto cleanup;
     
    329332                                            strncasecmp(infile + (namelen - 5), ".pobi", 5) != 0)) {
    330333                                fprintf(stderr, "Input file `%s` is not a Kindle/Mobipocket eBook.\n", infile);
    331                                 free(infile);
    332334                                rv = ERRCODE(EXIT_FAILURE);
    333335                                goto cleanup;
     
    337339                        /* Initialize main MOBIData structure */
    338340                        /* Must be deallocated with mobi_free() when not needed */
    339                         MOBIData* m = mobi_init();
     341                        m = mobi_init();
    340342                        if (m == NULL) {
    341343                                fprintf(stderr, "Memory allocation failed\n");
    342                                 free(infile);
    343344                                rv = ERRCODE(EXIT_FAILURE);
    344345                                goto cleanup;
     
    349350                        if (file == NULL) {
    350351                                fprintf(stderr, "Error opening file: %s (fopen: %m)\n", infile);
    351                                 mobi_free(m);
    352                                 free(infile);
    353352                                rv = ERRCODE(EXIT_FAILURE);
    354353                                goto cleanup;
     
    361360                        if (mobi_ret != MOBI_SUCCESS) {
    362361                                fprintf(stderr, "Error while loading document: %s\n", libmobi_msg(mobi_ret));
    363                                 mobi_free(m);
    364                                 free(infile);
    365362                                rv = ERRCODE(EXIT_FAILURE);
    366363                                goto cleanup;
     
    372369                                if (mobi_is_dictionary(m)) {
    373370                                        fprintf(stderr, "Input file `%s` is a dictionary!\n", infile);
    374                                         mobi_free(m);
    375                                         free(infile);
    376371                                        rv = ERRCODE(EXIT_FAILURE);
    377372                                        goto cleanup;
     
    382377                                if (exth == NULL) {
    383378                                        fprintf(stderr, "No CDE Type in EXTH for input file `%s`!\n", infile);
    384                                         mobi_free(m);
    385                                         free(infile);
    386379                                        rv = ERRCODE(EXIT_FAILURE);
    387380                                        goto cleanup;
    388381                                } else {
    389                                         char* cde_type = mobi_decode_exthstring(m, exth->data, exth->size);
     382                                        cde_type = mobi_decode_exthstring(m, exth->data, exth->size);
    390383                                        if (cde_type == NULL) {
    391384                                                fprintf(stderr,
    392385                                                        "Failed to decode CDE Type in EXTH for input file `%s`!\n",
    393386                                                        infile);
    394                                                 free(cde_type);
    395                                                 mobi_free(m);
    396                                                 free(infile);
    397387                                                rv = ERRCODE(EXIT_FAILURE);
    398388                                                goto cleanup;
     
    403393                                                            "Input file `%s` is neither a book nor a personal document!\n",
    404394                                                            infile);
    405                                                         free(cde_type);
    406                                                         mobi_free(m);
    407                                                         free(infile);
    408395                                                        rv = ERRCODE(EXIT_FAILURE);
    409396                                                        goto cleanup;
     
    416403                                                                        "Input file `%s` is not a periodical either!\n",
    417404                                                                        infile);
    418                                                                 free(cde_type);
    419                                                                 mobi_free(m);
    420                                                                 free(infile);
    421405                                                                rv = ERRCODE(EXIT_FAILURE);
    422406                                                                goto cleanup;
     
    430414                        /* And now do the thing! */
    431415                        rv = dump_cover(m, infile, outdir);
    432                         mobi_free(m);
    433                         free(infile);
    434 
    435416                        if (rv != EXIT_SUCCESS) {
    436417                                fprintf(stderr, "Failed to dump cover for file: %s\n", infile);
     
    438419                                goto cleanup;
    439420                        }
     421
     422                        // Get ready for the next iteration, without leaving dangling pointers
     423                        mobi_free(m);
     424                        m = NULL;
     425                        free(cde_type);
     426                        cde_type = NULL;
     427                        free(infile);
     428                        infile = NULL;
    440429                }
    441430        } else {
     
    446435
    447436cleanup:
     437        mobi_free(m);
     438        free(cde_type);
    448439        free(outdir);
     440        free(infile);
    449441
    450442        return rv;
Note: See TracChangeset for help on using the changeset viewer.