aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Stephens <allan.stephens@windriver.com>2006-06-26 02:37:24 -0400
committerDavid S. Miller <davem@davemloft.net>2006-06-26 02:37:24 -0400
commit9ab230f82f404e534387dda6067072291441a34d (patch)
treec0f6b2a17d640bea336795988f109e53120c0711
parent5e3c8854c1898828ffb0141d4ac4e6190aa9eb4e (diff)
[TIPC]: Prevent name table corruption if no room for new publication
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>
-rw-r--r--net/tipc/name_table.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c
index d129422fc5c2..051143648edb 100644
--- a/net/tipc/name_table.c
+++ b/net/tipc/name_table.c
@@ -284,18 +284,18 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
284 /* Ensure there is space for new sub-sequence */ 284 /* Ensure there is space for new sub-sequence */
285 285
286 if (nseq->first_free == nseq->alloc) { 286 if (nseq->first_free == nseq->alloc) {
287 struct sub_seq *sseqs = nseq->sseqs; 287 struct sub_seq *sseqs = tipc_subseq_alloc(nseq->alloc * 2);
288 nseq->sseqs = tipc_subseq_alloc(nseq->alloc * 2); 288
289 if (nseq->sseqs != NULL) { 289 if (!sseqs) {
290 memcpy(nseq->sseqs, sseqs,
291 nseq->alloc * sizeof (struct sub_seq));
292 kfree(sseqs);
293 dbg("Allocated %u sseqs\n", nseq->alloc);
294 nseq->alloc *= 2;
295 } else {
296 warn("Memory squeeze; failed to create sub-sequence\n"); 290 warn("Memory squeeze; failed to create sub-sequence\n");
297 return NULL; 291 return NULL;
298 } 292 }
293 dbg("Allocated %u more sseqs\n", nseq->alloc);
294 memcpy(sseqs, nseq->sseqs,
295 nseq->alloc * sizeof(struct sub_seq));
296 kfree(nseq->sseqs);
297 nseq->sseqs = sseqs;
298 nseq->alloc *= 2;
299 } 299 }
300 dbg("Have %u sseqs for type %u\n", nseq->alloc, type); 300 dbg("Have %u sseqs for type %u\n", nseq->alloc, type);
301 301