mirror of
https://github.com/fail0verflow/switch-linux.git
synced 2025-05-04 02:34:21 -04:00
[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: Ralf Baechle DL5RB <ralf@linux-mips.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3a93481589
commit
baed16a7ff
3 changed files with 15 additions and 18 deletions
|
@ -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)
|
||||||
/*
|
/*
|
||||||
* 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
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue