Ticket #866: valgrind-waypoint.patch

File valgrind-waypoint.patch, 2.0 KB (added by pini, 9 years ago)
  • navit/route.c

    Description: Fix an invalid read reported by valgrind for vehicle demo
     This error caused segfaults when the demo vehicle reached a waypoint
     or destination.
    Author: Gilles Filippini <pini@debian.org>
    Forwarded: http://trac.navit-project.org/ticket/866
    Last-Update: 2011-05-27
    old new  
    413413                        g_free(c);
    414414                        c=n;
    415415                }
    416                 g_free(this);
     416                this->in_use--;
     417                if (!this->in_use)
     418                        g_free(this);
    417419                if (!recurse)
    418420                        break;
    419421                this=next;
     
    696698        struct attr route_status;
    697699        struct route_info *prev_dst;
    698700        route_status.type=attr_route_status;
    699         if (this->path2 && this->path2->in_use) {
     701        if (this->path2 && (this->path2->in_use>1)) {
    700702                this->path2->update_required=1+new_graph;
    701703                return;
    702704        }
     
    21232125        struct route_path *ret;
    21242126
    21252127        ret=g_new0(struct route_path, 1);
     2128        ret->in_use=1;
    21262129        ret->path_hash=item_hash_new();
    21272130        route_path_add_line(ret, &pos->c, &dst->c, pos->lenextra+dst->lenextra);
    21282131        ret->updated=1;
     
    22542257                s=s2;
    22552258        }
    22562259        ret=g_new0(struct route_path, 1);
     2260        ret->in_use=1;
    22572261        ret->updated=1;
    22582262        if (pos->lenextra)
    22592263                route_path_add_line(ret, &pos->c, &pos->lp, pos->lenextra);
     
    32243228        }
    32253229        if (mr->path) {
    32263230                mr->path->in_use--;
    3227                 if (mr->path->update_required && !mr->path->in_use)
     3231                if (mr->path->update_required && (mr->path->in_use==1))
    32283232                        route_path_update_done(mr->mpriv->route, mr->path->update_required-1);
     3233                else if (!mr->path->in_use)
     3234                        g_free(mr->path);
    32293235        }
    32303236
    32313237        g_free(mr);
     
    33253331                mr->item.type=type_street_route;
    33263332                mr->seg=mr->seg_next;
    33273333                if (!mr->seg && mr->path && mr->path->next) {
     3334                        struct route_path *p=NULL;
    33283335                        mr->path->in_use--;
     3336                        if (!mr->path->in_use)
     3337                                p=mr->path;
    33293338                        mr->path=mr->path->next;
    33303339                        mr->path->in_use++;
    33313340                        mr->seg=mr->path->path;
     3341                        if (p)
     3342                                g_free(p);
    33323343                }
    33333344                if (mr->seg) {
    33343345                        mr->seg_next=mr->seg->next;