Commit baed16a7 authored by Ralf Baechle's avatar Ralf Baechle Committed by David S. Miller

[AX.25]: Make asc2ax() thread-proof

Asc2ax was still using a static buffer for all invocations which isn't
exactly SMP-safe.  Change asc2ax to take an additional result buffer as
the argument.  Change all callers to provide such a buffer.

This one only really is a fix for ROSE and as per recent discussions
there's still much more to fix in ROSE ...
Signed-off-by: default avatarRalf Baechle DL5RB <ralf@linux-mips.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3a934815
...@@ -258,7 +258,7 @@ extern struct sock *ax25_make_new(struct sock *, struct ax25_dev *); ...@@ -258,7 +258,7 @@ extern struct sock *ax25_make_new(struct sock *, struct ax25_dev *);
/* ax25_addr.c */ /* ax25_addr.c */
extern ax25_address null_ax25_address; extern ax25_address null_ax25_address;
extern char *ax2asc(char *buf, ax25_address *); extern char *ax2asc(char *buf, ax25_address *);
extern ax25_address *asc2ax(char *); extern void asc2ax(ax25_address *addr, char *callsign);
extern int ax25cmp(ax25_address *, ax25_address *); extern int ax25cmp(ax25_address *, ax25_address *);
extern int ax25digicmp(ax25_digi *, ax25_digi *); extern int ax25digicmp(ax25_digi *, ax25_digi *);
extern unsigned char *ax25_addr_parse(unsigned char *, int, ax25_address *, ax25_address *, ax25_digi *, int *, int *); extern unsigned char *ax25_addr_parse(unsigned char *, int, ax25_address *, ax25_address *, ax25_digi *, int *, int *);
......
...@@ -67,37 +67,34 @@ char *ax2asc(char *buf, ax25_address *a) ...@@ -67,37 +67,34 @@ char *ax2asc(char *buf, ax25_address *a)
/* /*
* ascii -> ax25 conversion * ascii -> ax25 conversion
*/ */
ax25_address *asc2ax(char *callsign) void asc2ax(ax25_address *addr, char *callsign)
{ {
static ax25_address addr;
char *s; char *s;
int n; int n;
for (s = callsign, n = 0; n < 6; n++) { for (s = callsign, n = 0; n < 6; n++) {
if (*s != '\0' && *s != '-') if (*s != '\0' && *s != '-')
addr.ax25_call[n] = *s++; addr->ax25_call[n] = *s++;
else else
addr.ax25_call[n] = ' '; addr->ax25_call[n] = ' ';
addr.ax25_call[n] <<= 1; addr->ax25_call[n] <<= 1;
addr.ax25_call[n] &= 0xFE; addr->ax25_call[n] &= 0xFE;
} }
if (*s++ == '\0') { if (*s++ == '\0') {
addr.ax25_call[6] = 0x00; addr->ax25_call[6] = 0x00;
return &addr; return;
} }
addr.ax25_call[6] = *s++ - '0'; addr->ax25_call[6] = *s++ - '0';
if (*s != '\0') { if (*s != '\0') {
addr.ax25_call[6] *= 10; addr->ax25_call[6] *= 10;
addr.ax25_call[6] += *s++ - '0'; addr->ax25_call[6] += *s++ - '0';
} }
addr.ax25_call[6] <<= 1; addr->ax25_call[6] <<= 1;
addr.ax25_call[6] &= 0x1E; addr->ax25_call[6] &= 0x1E;
return &addr;
} }
/* /*
......
...@@ -337,13 +337,13 @@ static int rose_parse_ccitt(unsigned char *p, struct rose_facilities_struct *fac ...@@ -337,13 +337,13 @@ static int rose_parse_ccitt(unsigned char *p, struct rose_facilities_struct *fac
memcpy(&facilities->source_addr, p + 7, ROSE_ADDR_LEN); memcpy(&facilities->source_addr, p + 7, ROSE_ADDR_LEN);
memcpy(callsign, p + 12, l - 10); memcpy(callsign, p + 12, l - 10);
callsign[l - 10] = '\0'; callsign[l - 10] = '\0';
facilities->source_call = *asc2ax(callsign); asc2ax(&facilities->source_call, callsign);
} }
if (*p == FAC_CCITT_SRC_NSAP) { if (*p == FAC_CCITT_SRC_NSAP) {
memcpy(&facilities->dest_addr, p + 7, ROSE_ADDR_LEN); memcpy(&facilities->dest_addr, p + 7, ROSE_ADDR_LEN);
memcpy(callsign, p + 12, l - 10); memcpy(callsign, p + 12, l - 10);
callsign[l - 10] = '\0'; callsign[l - 10] = '\0';
facilities->dest_call = *asc2ax(callsign); asc2ax(&facilities->dest_call, callsign);
} }
p += l + 2; p += l + 2;
n += l + 2; n += l + 2;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment