[TIPC]: Prevent name table corruption if no room for new publication
authorAllan Stephens <allan.stephens@windriver.com>
Mon, 26 Jun 2006 06:37:24 +0000 (23:37 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 26 Jun 2006 06:37:24 +0000 (23:37 -0700)
Now exits cleanly if attempt to allocate larger array of subsequences fails,
without losing track of pointer to existing array.

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Per Liden <per.liden@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/name_table.c

index d129422fc5c22ed23ad469f069fdf3de66d8da35..051143648edb741adae911a07551a339e431ccc4 100644 (file)
@@ -284,18 +284,18 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
                /* Ensure there is space for new sub-sequence */
 
                if (nseq->first_free == nseq->alloc) {
-                       struct sub_seq *sseqs = nseq->sseqs;
-                       nseq->sseqs = tipc_subseq_alloc(nseq->alloc * 2);
-                       if (nseq->sseqs != NULL) {
-                               memcpy(nseq->sseqs, sseqs,
-                                      nseq->alloc * sizeof (struct sub_seq));
-                               kfree(sseqs);
-                               dbg("Allocated %u sseqs\n", nseq->alloc);
-                               nseq->alloc *= 2;
-                       } else {
+                       struct sub_seq *sseqs = tipc_subseq_alloc(nseq->alloc * 2);
+
+                       if (!sseqs) {
                                warn("Memory squeeze; failed to create sub-sequence\n");
                                return NULL;
                        }
+                       dbg("Allocated %u more sseqs\n", nseq->alloc);
+                       memcpy(sseqs, nseq->sseqs,
+                              nseq->alloc * sizeof(struct sub_seq));
+                       kfree(nseq->sseqs);
+                       nseq->sseqs = sseqs;
+                       nseq->alloc *= 2;
                }
                dbg("Have %u sseqs for type %u\n", nseq->alloc, type);