Ignore:
Timestamp:
May 15, 2009, 4:56:31 AM (15 years ago)
Author:
Bruno Cornec
Message:
  • Use new libmr.a in build process
  • Use mr_strcat to fix a memory allocation bug when mountlist contains lots of references unavailable at restore time, creating a error when memory is statically allocated (more usage is expected now).
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.9/mondo/src/common/libmondo-mountlist.c

    r2207 r2209  
    1010
    1111#include "my-stuff.h"
    12 #include "mr_str.h"
     12#include "mr_mem.h"
    1313#include "mondostructures.h"
    1414#include "libmondo-mountlist.h"
     
    6262    char mountpoint[MAX_STR_LEN];
    6363
     64    char *flaws_str = NULL;
     65
    6466    /*@ long *********************************************************** */
    6567    long physical_drive_size = 0;
     
    7274    prev_part_no = 0;
    7375    tmp[0] = '\0';
     76    asprintf(&flaws_str, "%s", "");
    7477
    7578
     
    7881    if (physical_drive_size < 0) {
    7982        sprintf(tmp, " %s does not exist.", drive);
    80         asprintf(&flaws_str, "%s", tmp);
     83        mr_strcat(flaws_str, "%s", tmp);
    8184    } else {
    8285        sprintf(tmp, "%s is %ld MB", drive, physical_drive_size);
     
    166169        if (((pos >= 0) || npos) && foundsome) {
    167170            mr_strcat(flaws_str, " %s has both DD and PC-style partitions.", drive);
    168             return ++res;       // fatal error
     171            return(flaws_str);      // fatal error
    169172        }
    170173
     
    177180                    sprintf(tmp, " Gap prior to %s.", device);
    178181                    log_it(tmp);
    179                     mr_strcat(flaws_str, tmp);
     182                    mr_strcat(flaws_str, "%s", tmp);
    180183                    res++;
    181184                } else if (curr_part_no > 5
     
    184187                            prev_part_no, curr_part_no);
    185188                    log_it(tmp);
    186                     mr_strcat(flaws_str, tmp);
     189                    mr_strcat(flaws_str, "%s", tmp);
    187190                    res++;
    188191                }
     
    195198                sprintf(tmp, " Partition %ss4 is occupied.", drive);
    196199                log_it(tmp);
    197                 mr_strcat(flaws_str, tmp);
     200                mr_strcat(flaws_str, "%s", tmp);
    198201                res++;
    199202            }
     
    208211                sprintf(tmp, " %s %s's.", number_to_text(device_copies),
    209212                        device);
    210                 if (!strstr(flaws_str, tmp)) {
     213                if (!strstr(flaws_str, "%s", tmp)) {
    211214                    log_it(tmp);
    212                     mr_strcat(flaws_str, tmp);
     215                    mr_strcat(flaws_str, "%s", tmp);
    213216                    res++;
    214217                }
     
    219222                sprintf(tmp, " %s is tiny!", device);
    220223                log_it(tmp);
    221                 mr_strcat(flaws_str, tmp);
     224                mr_strcat(flaws_str, "%s", tmp);
    222225                res++;
    223226            }
     
    231234                sprintf(tmp, " %s has a weird mountpoint.", device);
    232235                log_it(tmp);
    233                 mr_strcat(flaws_str, tmp);
     236                mr_strcat(flaws_str, "%s", tmp);
    234237                res++;
    235238            }
     
    238241                sprintf(tmp, " %s has unsupported format %s.", device, mountlist->el[pos].format);
    239242                log_it(tmp);
    240                 mr_strcat(flaws_str, tmp);
     243                mr_strcat(flaws_str, "%s", tmp);
    241244                res++;
    242245            }
     
    254257                    sprintf(tmp, " Can only have up to 'h' in disklabel.");
    255258                    log_it(tmp);
    256                     mr_strcat(flaws_str, tmp);
     259                    mr_strcat(flaws_str, "%s", tmp);
    257260                    res++;
    258261                }
     
    269272                    if (!strstr(flaws_str, tmp)) {
    270273                        log_it(tmp);
    271                         mr_strcat(flaws_str, tmp);
     274                        mr_strcat(flaws_str, "%s", tmp);
    272275                        res++;
    273276                    }
     
    278281                    sprintf(tmp, " %s is tiny!", device);
    279282                    log_it(tmp);
    280                     mr_strcat(flaws_str, tmp);
     283                    mr_strcat(flaws_str, "%s", tmp);
    281284                    res++;
    282285                }
     
    290293                    sprintf(tmp, " %s has a weird mountpoint.", device);
    291294                    log_it(tmp);
    292                     mr_strcat(flaws_str, tmp);
     295                    mr_strcat(flaws_str, "%s", tmp);
    293296                    res++;
    294297                }
     
    298301                    sprintf(tmp, " %s has unsupported format %s.", device, mountlist->el[pos].format);
    299302                    log_it(tmp);
    300                     mr_strcat(flaws_str, tmp);
     303                    mr_strcat(flaws_str, "%s", tmp);
    301304                    res++;
    302305                }
     
    317320                amount_allocated - physical_drive_size, drive);
    318321        log_it(tmp);
    319         mr_strcat(flaws_str, tmp);
     322        mr_strcat(flaws_str, "%s", tmp);
    320323        res++;
    321324    } else if (amount_allocated < physical_drive_size - 1) {    /* NOT AN ERROR, JUST A WARNING :-) */
     
    323326                physical_drive_size - amount_allocated, drive);
    324327        log_it(tmp);
    325         mr_strcat(flaws_str, tmp);
     328        mr_strcat(flaws_str, "%s", tmp);
    326329    }
    327330    if (res) {
    328         return (FALSE);
     331        return (NULL);
    329332    } else {
    330         return (TRUE);
     333        return (flaws_str);
    331334    }
    332335}
     
    348351    char *tmp;
    349352    char *device;
     353    char *flaws_str = NULL;
    350354
    351355    /*@ long *********************************************************** */
     
    359363    assert_string_is_neither_NULL_nor_zerolength(drive);
    360364    assert(mountlist != NULL);
    361     assert(flaws_str != NULL);
     365    asprintf(&flaws_str, "%s", "");
    362366
    363367    malloc_string(tmp);
    364368    malloc_string(device);
    365     flaws_str[0] = '\0';
    366369    prev_part_no = 0;
    367370    tmp[0] = '\0';
     
    372375    if (physical_drive_size < 0) {
    373376        sprintf(tmp, " %s does not exist.", drive);
    374         strcat(flaws_str, tmp);
     377        mr_strcat(flaws_str, "%s", tmp);
    375378        res++;
    376379        log_msg(1, tmp);
     
    392395                sprintf(tmp, " Gap prior to %s.", device);
    393396                log_it(tmp);
    394                 strcat(flaws_str, tmp);
     397                mr_strcat(flaws_str, "%s", tmp);
    395398                res++;
    396399            } else if (curr_part_no > 5
     
    399402                        prev_part_no, curr_part_no);
    400403                log_it(tmp);
    401                 strcat(flaws_str, tmp);
     404                mr_strcat(flaws_str, "%s", tmp);
    402405                res++;
    403406            }
     
    410413            sprintf(tmp, " Partition 4 of %s is occupied.", drive);
    411414            log_it(tmp);
    412             strcat(flaws_str, tmp);
     415            mr_strcat(flaws_str, "%s", tmp);
    413416            res++;
    414417        }
     
    425428            if (!strstr(flaws_str, tmp)) {
    426429                log_it(tmp);
    427                 strcat(flaws_str, tmp);
     430                mr_strcat(flaws_str, "%s", tmp);
    428431                res++;
    429432            }
     
    434437            sprintf(tmp, " %s is tiny!", device);
    435438            log_it(tmp);
    436             strcat(flaws_str, tmp);
     439            mr_strcat(flaws_str, "%s", tmp);
    437440            res++;
    438441        }
     
    445448            sprintf(tmp, " %s has a weird mountpoint.", device);
    446449            log_it(tmp);
    447             strcat(flaws_str, tmp);
     450            mr_strcat(flaws_str, "%s", tmp);
    448451            res++;
    449452        }
     
    452455            sprintf(tmp, " %s has unsupported format %s.", device, mountlist->el[pos].format);
    453456            log_it(tmp);
    454             strcat(flaws_str, tmp);
     457            mr_strcat(flaws_str, "%s", tmp);
    455458            res++;
    456459        }
     
    465468                amount_allocated - physical_drive_size, drive);
    466469        log_it(tmp);
    467         strcat(flaws_str, tmp);
     470        mr_strcat(flaws_str, "%s", tmp);
    468471        res++;
    469472    } else if (amount_allocated < physical_drive_size - 1) {    /* NOT AN ERROR, JUST A WARNING :-) */
     
    471474                physical_drive_size - amount_allocated, drive);
    472475        log_it(tmp);
    473         strcat(flaws_str, tmp);
     476        mr_strcat(flaws_str, "%s", tmp);
    474477    }
    475478
     
    479482
    480483    if (res) {
    481         return (FALSE);
     484        return (NULL);
    482485    } else {
    483         return (TRUE);
     486        return (flaws_str);
    484487    }
    485488}
     
    514517
    515518    drivelist = malloc(sizeof(struct list_of_disks));
    516     malloc_string(flaws_str);
    517519    assert(mountlist != NULL);
    518520    assert(flaws_str_A != NULL);
    519521    assert(flaws_str_B != NULL);
    520522    assert(flaws_str_C != NULL);
    521     flaws_str[0] = '\0';
     523
     524    asprintf(&flaws_str, "%s", "");
    522525
    523526    make_list_of_drives_in_mountlist(mountlist, drivelist);
     
    540543        log_msg(8,"Entry: %d (%s)", i, drivelist->el[i].device);
    541544        log_msg(8,"Adding: %s to %s", tmp, flaws_str);
    542         strncat(flaws_str, tmp, MAX_STR_LEN -1);
     545        mr_strcat(flaws_str, "%s", tmp);
    543546        paranoid_free(tmp);
    544547    }
    545548    res += look_for_duplicate_mountpoints(mountlist, flaws_str);
    546     return (spread_flaws_across_three_lines
    547             (flaws_str, flaws_str_A, flaws_str_B, flaws_str_C, res));
     549    res = spread_flaws_across_three_lines(flaws_str, flaws_str_A, flaws_str_B, flaws_str_C,res);
     550    paranoid_free(flaws_str);
     551    return(res);
    548552}
    549553
     
    584588 */
    585589int
    586 look_for_duplicate_mountpoints(struct mountlist_itself *mountlist,
    587                                char *flaws_str)
     590look_for_duplicate_mountpoints(struct mountlist_itself *mountlist, char *flaws_str)
    588591{
    589592
     
    617620            asprintf(&tmp, " %s %s's.", number_to_text(copies),
    618621                    curr_mountpoint);
    619             strcat(flaws_str, tmp);
     622            mr_strcat(flaws_str, "%s", tmp);
    620623            log_it(tmp);
    621624            paranoid_free(tmp);
Note: See TracChangeset for help on using the changeset viewer.