Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
3f024c1a
Commit
3f024c1a
authored
Aug 23, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
parents
a4cce104
dc16aaf2
Changes
18
Show whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
150 additions
and
112 deletions
+150
-112
include/net/ax25.h
include/net/ax25.h
+16
-2
include/net/sock.h
include/net/sock.h
+5
-0
net/ax25/af_ax25.c
net/ax25/af_ax25.c
+13
-14
net/ax25/ax25_route.c
net/ax25/ax25_route.c
+7
-5
net/ax25/ax25_uid.c
net/ax25/ax25_uid.c
+36
-47
net/ipv4/inetpeer.c
net/ipv4/inetpeer.c
+7
-4
net/ipv4/netfilter/ip_queue.c
net/ipv4/netfilter/ip_queue.c
+7
-0
net/ipv4/tcp.c
net/ipv4/tcp.c
+1
-1
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_ipv4.c
+7
-2
net/ipv4/tcp_output.c
net/ipv4/tcp_output.c
+0
-4
net/ipv6/netfilter/ip6_queue.c
net/ipv6/netfilter/ip6_queue.c
+7
-0
net/ipv6/tcp_ipv6.c
net/ipv6/tcp_ipv6.c
+7
-2
net/netrom/af_netrom.c
net/netrom/af_netrom.c
+17
-14
net/rose/af_rose.c
net/rose/af_rose.c
+14
-13
net/rose/rose_route.c
net/rose/rose_route.c
+4
-2
net/sched/sch_generic.c
net/sched/sch_generic.c
+1
-0
net/sctp/proc.c
net/sctp/proc.c
+1
-0
net/sunrpc/auth_gss/gss_krb5_crypto.c
net/sunrpc/auth_gss/gss_krb5_crypto.c
+0
-2
No files found.
include/net/ax25.h
View file @
3f024c1a
...
@@ -139,11 +139,25 @@ enum {
...
@@ -139,11 +139,25 @@ enum {
#define AX25_DEF_DS_TIMEOUT (3 * 60 * HZ)
/* DAMA timeout 3 minutes */
#define AX25_DEF_DS_TIMEOUT (3 * 60 * HZ)
/* DAMA timeout 3 minutes */
typedef
struct
ax25_uid_assoc
{
typedef
struct
ax25_uid_assoc
{
struct
ax25_uid_assoc
*
next
;
struct
hlist_node
uid_node
;
atomic_t
refcount
;
uid_t
uid
;
uid_t
uid
;
ax25_address
call
;
ax25_address
call
;
}
ax25_uid_assoc
;
}
ax25_uid_assoc
;
#define ax25_uid_for_each(__ax25, node, list) \
hlist_for_each_entry(__ax25, node, list, uid_node)
#define ax25_uid_hold(ax25) \
atomic_inc(&((ax25)->refcount))
static
inline
void
ax25_uid_put
(
ax25_uid_assoc
*
assoc
)
{
if
(
atomic_dec_and_test
(
&
assoc
->
refcount
))
{
kfree
(
assoc
);
}
}
typedef
struct
{
typedef
struct
{
ax25_address
calls
[
AX25_MAX_DIGIS
];
ax25_address
calls
[
AX25_MAX_DIGIS
];
unsigned
char
repeated
[
AX25_MAX_DIGIS
];
unsigned
char
repeated
[
AX25_MAX_DIGIS
];
...
@@ -376,7 +390,7 @@ extern unsigned long ax25_display_timer(struct timer_list *);
...
@@ -376,7 +390,7 @@ extern unsigned long ax25_display_timer(struct timer_list *);
/* ax25_uid.c */
/* ax25_uid.c */
extern
int
ax25_uid_policy
;
extern
int
ax25_uid_policy
;
extern
ax25_
address
*
ax25_findbyuid
(
uid_t
);
extern
ax25_
uid_assoc
*
ax25_findbyuid
(
uid_t
);
extern
int
ax25_uid_ioctl
(
int
,
struct
sockaddr_ax25
*
);
extern
int
ax25_uid_ioctl
(
int
,
struct
sockaddr_ax25
*
);
extern
struct
file_operations
ax25_uid_fops
;
extern
struct
file_operations
ax25_uid_fops
;
extern
void
ax25_uid_free
(
void
);
extern
void
ax25_uid_free
(
void
);
...
...
include/net/sock.h
View file @
3f024c1a
...
@@ -384,6 +384,11 @@ enum sock_flags {
...
@@ -384,6 +384,11 @@ enum sock_flags {
SOCK_QUEUE_SHRUNK
,
/* write queue has been shrunk recently */
SOCK_QUEUE_SHRUNK
,
/* write queue has been shrunk recently */
};
};
static
inline
void
sock_copy_flags
(
struct
sock
*
nsk
,
struct
sock
*
osk
)
{
nsk
->
sk_flags
=
osk
->
sk_flags
;
}
static
inline
void
sock_set_flag
(
struct
sock
*
sk
,
enum
sock_flags
flag
)
static
inline
void
sock_set_flag
(
struct
sock
*
sk
,
enum
sock_flags
flag
)
{
{
__set_bit
(
flag
,
&
sk
->
sk_flags
);
__set_bit
(
flag
,
&
sk
->
sk_flags
);
...
...
net/ax25/af_ax25.c
View file @
3f024c1a
...
@@ -875,12 +875,7 @@ struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
...
@@ -875,12 +875,7 @@ struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
sk
->
sk_sndbuf
=
osk
->
sk_sndbuf
;
sk
->
sk_sndbuf
=
osk
->
sk_sndbuf
;
sk
->
sk_state
=
TCP_ESTABLISHED
;
sk
->
sk_state
=
TCP_ESTABLISHED
;
sk
->
sk_sleep
=
osk
->
sk_sleep
;
sk
->
sk_sleep
=
osk
->
sk_sleep
;
sock_copy_flags
(
sk
,
osk
);
if
(
sock_flag
(
osk
,
SOCK_DBG
))
sock_set_flag
(
sk
,
SOCK_DBG
);
if
(
sock_flag
(
osk
,
SOCK_ZAPPED
))
sock_set_flag
(
sk
,
SOCK_ZAPPED
);
oax25
=
ax25_sk
(
osk
);
oax25
=
ax25_sk
(
osk
);
...
@@ -1007,7 +1002,8 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
...
@@ -1007,7 +1002,8 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
struct
sock
*
sk
=
sock
->
sk
;
struct
sock
*
sk
=
sock
->
sk
;
struct
full_sockaddr_ax25
*
addr
=
(
struct
full_sockaddr_ax25
*
)
uaddr
;
struct
full_sockaddr_ax25
*
addr
=
(
struct
full_sockaddr_ax25
*
)
uaddr
;
ax25_dev
*
ax25_dev
=
NULL
;
ax25_dev
*
ax25_dev
=
NULL
;
ax25_address
*
call
;
ax25_uid_assoc
*
user
;
ax25_address
call
;
ax25_cb
*
ax25
;
ax25_cb
*
ax25
;
int
err
=
0
;
int
err
=
0
;
...
@@ -1026,9 +1022,15 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
...
@@ -1026,9 +1022,15 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
if
(
addr
->
fsa_ax25
.
sax25_family
!=
AF_AX25
)
if
(
addr
->
fsa_ax25
.
sax25_family
!=
AF_AX25
)
return
-
EINVAL
;
return
-
EINVAL
;
call
=
ax25_findbyuid
(
current
->
euid
);
user
=
ax25_findbyuid
(
current
->
euid
);
if
(
call
==
NULL
&&
ax25_uid_policy
&&
!
capable
(
CAP_NET_ADMIN
))
{
if
(
user
)
{
call
=
user
->
call
;
ax25_uid_put
(
user
);
}
else
{
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_ADMIN
))
return
-
EACCES
;
return
-
EACCES
;
call
=
addr
->
fsa_ax25
.
sax25_call
;
}
}
lock_sock
(
sk
);
lock_sock
(
sk
);
...
@@ -1039,10 +1041,7 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
...
@@ -1039,10 +1041,7 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
goto
out
;
goto
out
;
}
}
if
(
call
==
NULL
)
ax25
->
source_addr
=
call
;
ax25
->
source_addr
=
addr
->
fsa_ax25
.
sax25_call
;
else
ax25
->
source_addr
=
*
call
;
/*
/*
* User already set interface with SO_BINDTODEVICE
* User already set interface with SO_BINDTODEVICE
...
...
net/ax25/ax25_route.c
View file @
3f024c1a
...
@@ -422,8 +422,8 @@ static inline void ax25_adjust_path(ax25_address *addr, ax25_digi *digipeat)
...
@@ -422,8 +422,8 @@ static inline void ax25_adjust_path(ax25_address *addr, ax25_digi *digipeat)
*/
*/
int
ax25_rt_autobind
(
ax25_cb
*
ax25
,
ax25_address
*
addr
)
int
ax25_rt_autobind
(
ax25_cb
*
ax25
,
ax25_address
*
addr
)
{
{
ax25_uid_assoc
*
user
;
ax25_route
*
ax25_rt
;
ax25_route
*
ax25_rt
;
ax25_address
*
call
;
int
err
;
int
err
;
if
((
ax25_rt
=
ax25_get_route
(
addr
,
NULL
))
==
NULL
)
if
((
ax25_rt
=
ax25_get_route
(
addr
,
NULL
))
==
NULL
)
...
@@ -434,16 +434,18 @@ int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr)
...
@@ -434,16 +434,18 @@ int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr)
goto
put
;
goto
put
;
}
}
if
((
call
=
ax25_findbyuid
(
current
->
euid
))
==
NULL
)
{
user
=
ax25_findbyuid
(
current
->
euid
);
if
(
user
)
{
ax25
->
source_addr
=
user
->
call
;
ax25_uid_put
(
user
);
}
else
{
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_BIND_SERVICE
))
{
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_BIND_SERVICE
))
{
err
=
-
EPERM
;
err
=
-
EPERM
;
goto
put
;
goto
put
;
}
}
call
=
(
ax25_address
*
)
ax25
->
ax25_dev
->
dev
->
dev_addr
;
ax25
->
source_addr
=
*
(
ax25_address
*
)
ax25
->
ax25_dev
->
dev
->
dev_addr
;
}
}
ax25
->
source_addr
=
*
call
;
if
(
ax25_rt
->
digipeat
!=
NULL
)
{
if
(
ax25_rt
->
digipeat
!=
NULL
)
{
if
((
ax25
->
digipeat
=
kmalloc
(
sizeof
(
ax25_digi
),
GFP_ATOMIC
))
==
NULL
)
{
if
((
ax25
->
digipeat
=
kmalloc
(
sizeof
(
ax25_digi
),
GFP_ATOMIC
))
==
NULL
)
{
err
=
-
ENOMEM
;
err
=
-
ENOMEM
;
...
...
net/ax25/ax25_uid.c
View file @
3f024c1a
...
@@ -28,6 +28,7 @@
...
@@ -28,6 +28,7 @@
#include <linux/fcntl.h>
#include <linux/fcntl.h>
#include <linux/mm.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/interrupt.h>
#include <linux/list.h>
#include <linux/notifier.h>
#include <linux/notifier.h>
#include <linux/proc_fs.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/seq_file.h>
...
@@ -41,38 +42,41 @@
...
@@ -41,38 +42,41 @@
* Callsign/UID mapper. This is in kernel space for security on multi-amateur machines.
* Callsign/UID mapper. This is in kernel space for security on multi-amateur machines.
*/
*/
static
ax25_uid_assoc
*
ax25_uid_list
;
HLIST_HEAD
(
ax25_uid_list
)
;
static
DEFINE_RWLOCK
(
ax25_uid_lock
);
static
DEFINE_RWLOCK
(
ax25_uid_lock
);
int
ax25_uid_policy
=
0
;
int
ax25_uid_policy
=
0
;
ax25_
address
*
ax25_findbyuid
(
uid_t
uid
)
ax25_
uid_assoc
*
ax25_findbyuid
(
uid_t
uid
)
{
{
ax25_uid_assoc
*
ax25_uid
;
ax25_uid_assoc
*
ax25_uid
,
*
res
=
NULL
;
ax25_address
*
res
=
NULL
;
struct
hlist_node
*
node
;
read_lock
(
&
ax25_uid_lock
);
read_lock
(
&
ax25_uid_lock
);
for
(
ax25_uid
=
ax25_uid_list
;
ax25_uid
!=
NULL
;
ax25_uid
=
ax25_uid
->
nex
t
)
{
ax25_uid_for_each
(
ax25_uid
,
node
,
&
ax25_uid_lis
t
)
{
if
(
ax25_uid
->
uid
==
uid
)
{
if
(
ax25_uid
->
uid
==
uid
)
{
res
=
&
ax25_uid
->
call
;
ax25_uid_hold
(
ax25_uid
);
res
=
ax25_uid
;
break
;
break
;
}
}
}
}
read_unlock
(
&
ax25_uid_lock
);
read_unlock
(
&
ax25_uid_lock
);
return
NULL
;
return
res
;
}
}
int
ax25_uid_ioctl
(
int
cmd
,
struct
sockaddr_ax25
*
sax
)
int
ax25_uid_ioctl
(
int
cmd
,
struct
sockaddr_ax25
*
sax
)
{
{
ax25_uid_assoc
*
s
,
*
ax25_uid
;
ax25_uid_assoc
*
ax25_uid
;
struct
hlist_node
*
node
;
ax25_uid_assoc
*
user
;
unsigned
long
res
;
unsigned
long
res
;
switch
(
cmd
)
{
switch
(
cmd
)
{
case
SIOCAX25GETUID
:
case
SIOCAX25GETUID
:
res
=
-
ENOENT
;
res
=
-
ENOENT
;
read_lock
(
&
ax25_uid_lock
);
read_lock
(
&
ax25_uid_lock
);
for
(
ax25_uid
=
ax25_uid_list
;
ax25_uid
!=
NULL
;
ax25_uid
=
ax25_uid
->
nex
t
)
{
ax25_uid_for_each
(
ax25_uid
,
node
,
&
ax25_uid_lis
t
)
{
if
(
ax25cmp
(
&
sax
->
sax25_call
,
&
ax25_uid
->
call
)
==
0
)
{
if
(
ax25cmp
(
&
sax
->
sax25_call
,
&
ax25_uid
->
call
)
==
0
)
{
res
=
ax25_uid
->
uid
;
res
=
ax25_uid
->
uid
;
break
;
break
;
...
@@ -85,19 +89,22 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
...
@@ -85,19 +89,22 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
case
SIOCAX25ADDUID
:
case
SIOCAX25ADDUID
:
if
(
!
capable
(
CAP_NET_ADMIN
))
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
return
-
EPERM
;
if
(
ax25_findbyuid
(
sax
->
sax25_uid
))
user
=
ax25_findbyuid
(
sax
->
sax25_uid
);
if
(
user
)
{
ax25_uid_put
(
user
);
return
-
EEXIST
;
return
-
EEXIST
;
}
if
(
sax
->
sax25_uid
==
0
)
if
(
sax
->
sax25_uid
==
0
)
return
-
EINVAL
;
return
-
EINVAL
;
if
((
ax25_uid
=
kmalloc
(
sizeof
(
*
ax25_uid
),
GFP_KERNEL
))
==
NULL
)
if
((
ax25_uid
=
kmalloc
(
sizeof
(
*
ax25_uid
),
GFP_KERNEL
))
==
NULL
)
return
-
ENOMEM
;
return
-
ENOMEM
;
atomic_set
(
&
ax25_uid
->
refcount
,
1
);
ax25_uid
->
uid
=
sax
->
sax25_uid
;
ax25_uid
->
uid
=
sax
->
sax25_uid
;
ax25_uid
->
call
=
sax
->
sax25_call
;
ax25_uid
->
call
=
sax
->
sax25_call
;
write_lock
(
&
ax25_uid_lock
);
write_lock
(
&
ax25_uid_lock
);
ax25_uid
->
next
=
ax25_uid_list
;
hlist_add_head
(
&
ax25_uid
->
uid_node
,
&
ax25_uid_list
);
ax25_uid_list
=
ax25_uid
;
write_unlock
(
&
ax25_uid_lock
);
write_unlock
(
&
ax25_uid_lock
);
return
0
;
return
0
;
...
@@ -106,34 +113,21 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
...
@@ -106,34 +113,21 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
if
(
!
capable
(
CAP_NET_ADMIN
))
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
return
-
EPERM
;
ax25_uid
=
NULL
;
write_lock
(
&
ax25_uid_lock
);
write_lock
(
&
ax25_uid_lock
);
for
(
ax25_uid
=
ax25_uid_list
;
ax25_uid
!=
NULL
;
ax25_uid
=
ax25_uid
->
nex
t
)
{
ax25_uid_for_each
(
ax25_uid
,
node
,
&
ax25_uid_lis
t
)
{
if
(
ax25cmp
(
&
sax
->
sax25_call
,
&
ax25_uid
->
call
)
==
0
)
{
if
(
ax25cmp
(
&
sax
->
sax25_call
,
&
ax25_uid
->
call
)
==
0
)
break
;
break
;
}
}
}
if
(
ax25_uid
==
NULL
)
{
if
(
ax25_uid
==
NULL
)
{
write_unlock
(
&
ax25_uid_lock
);
write_unlock
(
&
ax25_uid_lock
);
return
-
ENOENT
;
return
-
ENOENT
;
}
}
if
((
s
=
ax25_uid_list
)
==
ax25_uid
)
{
hlist_del_init
(
&
ax25_uid
->
uid_node
);
ax25_uid_list
=
s
->
next
;
ax25_uid_put
(
ax25_uid
);
write_unlock
(
&
ax25_uid_lock
);
kfree
(
ax25_uid
);
return
0
;
}
while
(
s
!=
NULL
&&
s
->
next
!=
NULL
)
{
if
(
s
->
next
==
ax25_uid
)
{
s
->
next
=
ax25_uid
->
next
;
write_unlock
(
&
ax25_uid_lock
);
kfree
(
ax25_uid
);
return
0
;
}
s
=
s
->
next
;
}
write_unlock
(
&
ax25_uid_lock
);
write_unlock
(
&
ax25_uid_lock
);
return
-
ENOENT
;
return
0
;
default:
default:
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -147,13 +141,11 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
...
@@ -147,13 +141,11 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
static
void
*
ax25_uid_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
static
void
*
ax25_uid_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
{
struct
ax25_uid_assoc
*
pt
;
struct
ax25_uid_assoc
*
pt
;
int
i
=
1
;
struct
hlist_node
*
node
;
int
i
=
0
;
read_lock
(
&
ax25_uid_lock
);
read_lock
(
&
ax25_uid_lock
);
if
(
*
pos
==
0
)
ax25_uid_for_each
(
pt
,
node
,
&
ax25_uid_list
)
{
return
SEQ_START_TOKEN
;
for
(
pt
=
ax25_uid_list
;
pt
!=
NULL
;
pt
=
pt
->
next
)
{
if
(
i
==
*
pos
)
if
(
i
==
*
pos
)
return
pt
;
return
pt
;
++
i
;
++
i
;
...
@@ -164,8 +156,9 @@ static void *ax25_uid_seq_start(struct seq_file *seq, loff_t *pos)
...
@@ -164,8 +156,9 @@ static void *ax25_uid_seq_start(struct seq_file *seq, loff_t *pos)
static
void
*
ax25_uid_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
static
void
*
ax25_uid_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
{
++*
pos
;
++*
pos
;
return
(
v
==
SEQ_START_TOKEN
)
?
ax25_uid_list
:
((
struct
ax25_uid_assoc
*
)
v
)
->
next
;
return
hlist_entry
(((
ax25_uid_assoc
*
)
v
)
->
uid_node
.
next
,
ax25_uid_assoc
,
uid_node
);
}
}
static
void
ax25_uid_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
static
void
ax25_uid_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
...
@@ -180,7 +173,6 @@ static int ax25_uid_seq_show(struct seq_file *seq, void *v)
...
@@ -180,7 +173,6 @@ static int ax25_uid_seq_show(struct seq_file *seq, void *v)
else
{
else
{
struct
ax25_uid_assoc
*
pt
=
v
;
struct
ax25_uid_assoc
*
pt
=
v
;
seq_printf
(
seq
,
"%6d %s
\n
"
,
pt
->
uid
,
ax2asc
(
&
pt
->
call
));
seq_printf
(
seq
,
"%6d %s
\n
"
,
pt
->
uid
,
ax2asc
(
&
pt
->
call
));
}
}
return
0
;
return
0
;
...
@@ -213,16 +205,13 @@ struct file_operations ax25_uid_fops = {
...
@@ -213,16 +205,13 @@ struct file_operations ax25_uid_fops = {
*/
*/
void
__exit
ax25_uid_free
(
void
)
void
__exit
ax25_uid_free
(
void
)
{
{
ax25_uid_assoc
*
s
,
*
ax25_uid
;
ax25_uid_assoc
*
ax25_uid
;
struct
hlist_node
*
node
;
write_lock
(
&
ax25_uid_lock
);
write_lock
(
&
ax25_uid_lock
);
ax25_uid
=
ax25_uid_list
;
ax25_uid_for_each
(
ax25_uid
,
node
,
&
ax25_uid_list
)
{
while
(
ax25_uid
!=
NULL
)
{
hlist_del_init
(
&
ax25_uid
->
uid_node
);
s
=
ax25_uid
;
ax25_uid_put
(
ax25_uid
);
ax25_uid
=
ax25_uid
->
next
;
kfree
(
s
);
}
}
ax25_uid_list
=
NULL
;
write_unlock
(
&
ax25_uid_lock
);
write_unlock
(
&
ax25_uid_lock
);
}
}
net/ipv4/inetpeer.c
View file @
3f024c1a
...
@@ -450,6 +450,9 @@ static void peer_check_expire(unsigned long dummy)
...
@@ -450,6 +450,9 @@ static void peer_check_expire(unsigned long dummy)
/* Trigger the timer after inet_peer_gc_mintime .. inet_peer_gc_maxtime
/* Trigger the timer after inet_peer_gc_mintime .. inet_peer_gc_maxtime
* interval depending on the total number of entries (more entries,
* interval depending on the total number of entries (more entries,
* less interval). */
* less interval). */
if
(
peer_total
>=
inet_peer_threshold
)
peer_periodic_timer
.
expires
=
jiffies
+
inet_peer_gc_mintime
;
else
peer_periodic_timer
.
expires
=
jiffies
peer_periodic_timer
.
expires
=
jiffies
+
inet_peer_gc_maxtime
+
inet_peer_gc_maxtime
-
(
inet_peer_gc_maxtime
-
inet_peer_gc_mintime
)
/
HZ
*
-
(
inet_peer_gc_maxtime
-
inet_peer_gc_mintime
)
/
HZ
*
...
...
net/ipv4/netfilter/ip_queue.c
View file @
3f024c1a
...
@@ -214,6 +214,12 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
...
@@ -214,6 +214,12 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
break
;
break
;
case
IPQ_COPY_PACKET
:
case
IPQ_COPY_PACKET
:
if
(
entry
->
skb
->
ip_summed
==
CHECKSUM_HW
&&
(
*
errp
=
skb_checksum_help
(
entry
->
skb
,
entry
->
info
->
outdev
==
NULL
)))
{
read_unlock_bh
(
&
queue_lock
);
return
NULL
;
}
if
(
copy_range
==
0
||
copy_range
>
entry
->
skb
->
len
)
if
(
copy_range
==
0
||
copy_range
>
entry
->
skb
->
len
)
data_len
=
entry
->
skb
->
len
;
data_len
=
entry
->
skb
->
len
;
else
else
...
@@ -385,6 +391,7 @@ ipq_mangle_ipv4(ipq_verdict_msg_t *v, struct ipq_queue_entry *e)
...
@@ -385,6 +391,7 @@ ipq_mangle_ipv4(ipq_verdict_msg_t *v, struct ipq_queue_entry *e)
if
(
!
skb_ip_make_writable
(
&
e
->
skb
,
v
->
data_len
))
if
(
!
skb_ip_make_writable
(
&
e
->
skb
,
v
->
data_len
))
return
-
ENOMEM
;
return
-
ENOMEM
;
memcpy
(
e
->
skb
->
data
,
v
->
payload
,
v
->
data_len
);
memcpy
(
e
->
skb
->
data
,
v
->
payload
,
v
->
data_len
);
e
->
skb
->
ip_summed
=
CHECKSUM_NONE
;
e
->
skb
->
nfcache
|=
NFC_ALTERED
;
e
->
skb
->
nfcache
|=
NFC_ALTERED
;
/*
/*
...
...
net/ipv4/tcp.c
View file @
3f024c1a
...
@@ -584,7 +584,7 @@ static inline void skb_entail(struct sock *sk, struct tcp_sock *tp,
...
@@ -584,7 +584,7 @@ static inline void skb_entail(struct sock *sk, struct tcp_sock *tp,
sk_charge_skb
(
sk
,
skb
);
sk_charge_skb
(
sk
,
skb
);
if
(
!
sk
->
sk_send_head
)
if
(
!
sk
->
sk_send_head
)
sk
->
sk_send_head
=
skb
;
sk
->
sk_send_head
=
skb
;
else
if
(
tp
->
nonagle
&
TCP_NAGLE_PUSH
)
if
(
tp
->
nonagle
&
TCP_NAGLE_PUSH
)
tp
->
nonagle
&=
~
TCP_NAGLE_PUSH
;
tp
->
nonagle
&=
~
TCP_NAGLE_PUSH
;
}
}
...
...
net/ipv4/tcp_ipv4.c
View file @
3f024c1a
...
@@ -242,9 +242,14 @@ static int tcp_v4_get_port(struct sock *sk, unsigned short snum)
...
@@ -242,9 +242,14 @@ static int tcp_v4_get_port(struct sock *sk, unsigned short snum)
tcp_port_rover
=
rover
;
tcp_port_rover
=
rover
;
spin_unlock
(
&
tcp_portalloc_lock
);
spin_unlock
(
&
tcp_portalloc_lock
);
/* Exhausted local port range during search? */
/* Exhausted local port range during search? It is not
* possible for us to be holding one of the bind hash
* locks if this test triggers, because if 'remaining'
* drops to zero, we broke out of the do/while loop at
* the top level, not from the 'break;' statement.
*/
ret
=
1
;
ret
=
1
;
if
(
remaining
<=
0
)
if
(
unlikely
(
remaining
<=
0
)
)
goto
fail
;
goto
fail
;
/* OK, here is the one we will use. HEAD is
/* OK, here is the one we will use. HEAD is
...
...
net/ipv4/tcp_output.c
View file @
3f024c1a
...
@@ -925,10 +925,6 @@ static int tcp_tso_should_defer(struct sock *sk, struct tcp_sock *tp, struct sk_
...
@@ -925,10 +925,6 @@ static int tcp_tso_should_defer(struct sock *sk, struct tcp_sock *tp, struct sk_
limit
=
min
(
send_win
,
cong_win
);
limit
=
min
(
send_win
,
cong_win
);
/* If sk_send_head can be sent fully now, just do it. */
if
(
skb
->
len
<=
limit
)
return
0
;
if
(
sysctl_tcp_tso_win_divisor
)
{
if
(
sysctl_tcp_tso_win_divisor
)
{
u32
chunk
=
min
(
tp
->
snd_wnd
,
tp
->
snd_cwnd
*
tp
->
mss_cache
);
u32
chunk
=
min
(
tp
->
snd_wnd
,
tp
->
snd_cwnd
*
tp
->
mss_cache
);
...
...
net/ipv6/netfilter/ip6_queue.c
View file @
3f024c1a
...
@@ -211,6 +211,12 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
...
@@ -211,6 +211,12 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
break
;
break
;
case
IPQ_COPY_PACKET
:
case
IPQ_COPY_PACKET
:
if
(
entry
->
skb
->
ip_summed
==
CHECKSUM_HW
&&
(
*
errp
=
skb_checksum_help
(
entry
->
skb
,
entry
->
info
->
outdev
==
NULL
)))
{
read_unlock_bh
(
&
queue_lock
);
return
NULL
;
}
if
(
copy_range
==
0
||
copy_range
>
entry
->
skb
->
len
)
if
(
copy_range
==
0
||
copy_range
>
entry
->
skb
->
len
)
data_len
=
entry
->
skb
->
len
;
data_len
=
entry
->
skb
->
len
;
else
else
...
@@ -381,6 +387,7 @@ ipq_mangle_ipv6(ipq_verdict_msg_t *v, struct ipq_queue_entry *e)
...
@@ -381,6 +387,7 @@ ipq_mangle_ipv6(ipq_verdict_msg_t *v, struct ipq_queue_entry *e)
if
(
!
skb_ip_make_writable
(
&
e
->
skb
,
v
->
data_len
))
if
(
!
skb_ip_make_writable
(
&
e
->
skb
,
v
->
data_len
))
return
-
ENOMEM
;
return
-
ENOMEM
;
memcpy
(
e
->
skb
->
data
,
v
->
payload
,
v
->
data_len
);
memcpy
(
e
->
skb
->
data
,
v
->
payload
,
v
->
data_len
);
e
->
skb
->
ip_summed
=
CHECKSUM_NONE
;
e
->
skb
->
nfcache
|=
NFC_ALTERED
;
e
->
skb
->
nfcache
|=
NFC_ALTERED
;
/*
/*
...
...
net/ipv6/tcp_ipv6.c
View file @
3f024c1a
...
@@ -158,9 +158,14 @@ static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
...
@@ -158,9 +158,14 @@ static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
tcp_port_rover
=
rover
;
tcp_port_rover
=
rover
;
spin_unlock
(
&
tcp_portalloc_lock
);
spin_unlock
(
&
tcp_portalloc_lock
);
/* Exhausted local port range during search? */
/* Exhausted local port range during search? It is not
* possible for us to be holding one of the bind hash
* locks if this test triggers, because if 'remaining'
* drops to zero, we broke out of the do/while loop at
* the top level, not from the 'break;' statement.
*/
ret
=
1
;
ret
=
1
;
if
(
remaining
<=
0
)
if
(
unlikely
(
remaining
<=
0
)
)
goto
fail
;
goto
fail
;
/* OK, here is the one we will use. */
/* OK, here is the one we will use. */
...
...
net/netrom/af_netrom.c
View file @
3f024c1a
...
@@ -459,12 +459,7 @@ static struct sock *nr_make_new(struct sock *osk)
...
@@ -459,12 +459,7 @@ static struct sock *nr_make_new(struct sock *osk)
sk
->
sk_sndbuf
=
osk
->
sk_sndbuf
;
sk
->
sk_sndbuf
=
osk
->
sk_sndbuf
;
sk
->
sk_state
=
TCP_ESTABLISHED
;
sk
->
sk_state
=
TCP_ESTABLISHED
;
sk
->
sk_sleep
=
osk
->
sk_sleep
;
sk
->
sk_sleep
=
osk
->
sk_sleep
;
sock_copy_flags
(
sk
,
osk
);
if
(
sock_flag
(
osk
,
SOCK_ZAPPED
))
sock_set_flag
(
sk
,
SOCK_ZAPPED
);
if
(
sock_flag
(
osk
,
SOCK_DBG
))
sock_set_flag
(
sk
,
SOCK_DBG
);
skb_queue_head_init
(
&
nr
->
ack_queue
);
skb_queue_head_init
(
&
nr
->
ack_queue
);
skb_queue_head_init
(
&
nr
->
reseq_queue
);
skb_queue_head_init
(
&
nr
->
reseq_queue
);
...
@@ -541,7 +536,8 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
...
@@ -541,7 +536,8 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
struct
nr_sock
*
nr
=
nr_sk
(
sk
);
struct
nr_sock
*
nr
=
nr_sk
(
sk
);
struct
full_sockaddr_ax25
*
addr
=
(
struct
full_sockaddr_ax25
*
)
uaddr
;
struct
full_sockaddr_ax25
*
addr
=
(
struct
full_sockaddr_ax25
*
)
uaddr
;
struct
net_device
*
dev
;
struct
net_device
*
dev
;
ax25_address
*
user
,
*
source
;
ax25_uid_assoc
*
user
;
ax25_address
*
source
;
lock_sock
(
sk
);
lock_sock
(
sk
);
if
(
!
sock_flag
(
sk
,
SOCK_ZAPPED
))
{
if
(
!
sock_flag
(
sk
,
SOCK_ZAPPED
))
{
...
@@ -580,16 +576,19 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
...
@@ -580,16 +576,19 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
}
else
{
}
else
{
source
=
&
addr
->
fsa_ax25
.
sax25_call
;
source
=
&
addr
->
fsa_ax25
.
sax25_call
;
if
((
user
=
ax25_findbyuid
(
current
->
euid
))
==
NULL
)
{
user
=
ax25_findbyuid
(
current
->
euid
);
if
(
user
)
{
nr
->
user_addr
=
user
->
call
;
ax25_uid_put
(
user
);
}
else
{
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_BIND_SERVICE
))
{
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_BIND_SERVICE
))
{
release_sock
(
sk
);
release_sock
(
sk
);
dev_put
(
dev
);
dev_put
(
dev
);
return
-
EPERM
;
return
-
EPERM
;
}
}
user
=
source
;
nr
->
user_addr
=
*
source
;
}
}
nr
->
user_addr
=
*
user
;
nr
->
source_addr
=
*
source
;
nr
->
source_addr
=
*
source
;
}
}
...
@@ -609,7 +608,8 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
...
@@ -609,7 +608,8 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
struct
sock
*
sk
=
sock
->
sk
;
struct
sock
*
sk
=
sock
->
sk
;
struct
nr_sock
*
nr
=
nr_sk
(
sk
);
struct
nr_sock
*
nr
=
nr_sk
(
sk
);
struct
sockaddr_ax25
*
addr
=
(
struct
sockaddr_ax25
*
)
uaddr
;
struct
sockaddr_ax25
*
addr
=
(
struct
sockaddr_ax25
*
)
uaddr
;
ax25_address
*
user
,
*
source
=
NULL
;
ax25_address
*
source
=
NULL
;
ax25_uid_assoc
*
user
;
struct
net_device
*
dev
;
struct
net_device
*
dev
;
lock_sock
(
sk
);
lock_sock
(
sk
);
...
@@ -650,16 +650,19 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
...
@@ -650,16 +650,19 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
}
}
source
=
(
ax25_address
*
)
dev
->
dev_addr
;
source
=
(
ax25_address
*
)
dev
->
dev_addr
;
if
((
user
=
ax25_findbyuid
(
current
->
euid
))
==
NULL
)
{
user
=
ax25_findbyuid
(
current
->
euid
);
if
(
user
)
{
nr
->
user_addr
=
user
->
call
;
ax25_uid_put
(
user
);
}
else
{
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_ADMIN
))
{
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_ADMIN
))
{
dev_put
(
dev
);
dev_put
(
dev
);
release_sock
(
sk
);
release_sock
(
sk
);
return
-
EPERM
;
return
-
EPERM
;
}
}
user
=
source
;
nr
->
user_addr
=
*
source
;
}
}
nr
->
user_addr
=
*
user
;
nr
->
source_addr
=
*
source
;
nr
->
source_addr
=
*
source
;
nr
->
device
=
dev
;
nr
->
device
=
dev
;
...
...
net/rose/af_rose.c
View file @
3f024c1a
...
@@ -556,12 +556,7 @@ static struct sock *rose_make_new(struct sock *osk)
...
@@ -556,12 +556,7 @@ static struct sock *rose_make_new(struct sock *osk)
sk
->
sk_sndbuf
=
osk
->
sk_sndbuf
;
sk
->
sk_sndbuf
=
osk
->
sk_sndbuf
;
sk
->
sk_state
=
TCP_ESTABLISHED
;
sk
->
sk_state
=
TCP_ESTABLISHED
;
sk
->
sk_sleep
=
osk
->
sk_sleep
;
sk
->
sk_sleep
=
osk
->
sk_sleep
;
sock_copy_flags
(
sk
,
osk
);
if
(
sock_flag
(
osk
,
SOCK_ZAPPED
))
sock_set_flag
(
sk
,
SOCK_ZAPPED
);
if
(
sock_flag
(
osk
,
SOCK_DBG
))
sock_set_flag
(
sk
,
SOCK_DBG
);
init_timer
(
&
rose
->
timer
);
init_timer
(
&
rose
->
timer
);
init_timer
(
&
rose
->
idletimer
);
init_timer
(
&
rose
->
idletimer
);
...
@@ -631,7 +626,8 @@ static int rose_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
...
@@ -631,7 +626,8 @@ static int rose_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
struct
rose_sock
*
rose
=
rose_sk
(
sk
);
struct
rose_sock
*
rose
=
rose_sk
(
sk
);
struct
sockaddr_rose
*
addr
=
(
struct
sockaddr_rose
*
)
uaddr
;
struct
sockaddr_rose
*
addr
=
(
struct
sockaddr_rose
*
)
uaddr
;
struct
net_device
*
dev
;
struct
net_device
*
dev
;
ax25_address
*
user
,
*
source
;
ax25_address
*
source
;
ax25_uid_assoc
*
user
;
int
n
;
int
n
;
if
(
!
sock_flag
(
sk
,
SOCK_ZAPPED
))
if
(
!
sock_flag
(
sk
,
SOCK_ZAPPED
))
...
@@ -656,14 +652,17 @@ static int rose_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
...
@@ -656,14 +652,17 @@ static int rose_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
source
=
&
addr
->
srose_call
;
source
=
&
addr
->
srose_call
;
if
((
user
=
ax25_findbyuid
(
current
->
euid
))
==
NULL
)
{
user
=
ax25_findbyuid
(
current
->
euid
);
if
(
user
)
{
rose
->
source_call
=
user
->
call
;
ax25_uid_put
(
user
);
}
else
{
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_BIND_SERVICE
))
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_BIND_SERVICE
))
return
-
EACCES
;
return
-
EACCES
;
user
=
source
;
rose
->
source_call
=
*
source
;
}
}
rose
->
source_addr
=
addr
->
srose_addr
;
rose
->
source_addr
=
addr
->
srose_addr
;
rose
->
source_call
=
*
user
;
rose
->
device
=
dev
;
rose
->
device
=
dev
;
rose
->
source_ndigis
=
addr
->
srose_ndigis
;
rose
->
source_ndigis
=
addr
->
srose_ndigis
;
...
@@ -690,8 +689,8 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le
...
@@ -690,8 +689,8 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le
struct
rose_sock
*
rose
=
rose_sk
(
sk
);
struct
rose_sock
*
rose
=
rose_sk
(
sk
);
struct
sockaddr_rose
*
addr
=
(
struct
sockaddr_rose
*
)
uaddr
;
struct
sockaddr_rose
*
addr
=
(
struct
sockaddr_rose
*
)
uaddr
;
unsigned
char
cause
,
diagnostic
;
unsigned
char
cause
,
diagnostic
;
ax25_address
*
user
;
struct
net_device
*
dev
;
struct
net_device
*
dev
;
ax25_uid_assoc
*
user
;
int
n
;
int
n
;
if
(
sk
->
sk_state
==
TCP_ESTABLISHED
&&
sock
->
state
==
SS_CONNECTING
)
{
if
(
sk
->
sk_state
==
TCP_ESTABLISHED
&&
sock
->
state
==
SS_CONNECTING
)
{
...
@@ -741,12 +740,14 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le
...
@@ -741,12 +740,14 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le
if
((
dev
=
rose_dev_first
())
==
NULL
)
if
((
dev
=
rose_dev_first
())
==
NULL
)
return
-
ENETUNREACH
;
return
-
ENETUNREACH
;
if
((
user
=
ax25_findbyuid
(
current
->
euid
))
==
NULL
)
user
=
ax25_findbyuid
(
current
->
euid
);
if
(
!
user
)
return
-
EINVAL
;
return
-
EINVAL
;
memcpy
(
&
rose
->
source_addr
,
dev
->
dev_addr
,
ROSE_ADDR_LEN
);
memcpy
(
&
rose
->
source_addr
,
dev
->
dev_addr
,
ROSE_ADDR_LEN
);
rose
->
source_call
=
*
user
;
rose
->
source_call
=
user
->
call
;
rose
->
device
=
dev
;
rose
->
device
=
dev
;
ax25_uid_put
(
user
);
rose_insert_socket
(
sk
);
/* Finish the bind */
rose_insert_socket
(
sk
);
/* Finish the bind */
}
}
...
...
net/rose/rose_route.c
View file @
3f024c1a
...
@@ -994,8 +994,10 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
...
@@ -994,8 +994,10 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
* 1. The frame isn't for us,
* 1. The frame isn't for us,
* 2. It isn't "owned" by any existing route.
* 2. It isn't "owned" by any existing route.
*/
*/
if
(
frametype
!=
ROSE_CALL_REQUEST
)
/* XXX */
if
(
frametype
!=
ROSE_CALL_REQUEST
)
{
/* XXX */
return
0
;
ret
=
0
;
goto
out
;
}
len
=
(((
skb
->
data
[
3
]
>>
4
)
&
0x0F
)
+
1
)
/
2
;
len
=
(((
skb
->
data
[
3
]
>>
4
)
&
0x0F
)
+
1
)
/
2
;
len
+=
(((
skb
->
data
[
3
]
>>
0
)
&
0x0F
)
+
1
)
/
2
;
len
+=
(((
skb
->
data
[
3
]
>>
0
)
&
0x0F
)
+
1
)
/
2
;
...
...
net/sched/sch_generic.c
View file @
3f024c1a
...
@@ -438,6 +438,7 @@ struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops)
...
@@ -438,6 +438,7 @@ struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops)
if
(
!
ops
->
init
||
ops
->
init
(
sch
,
NULL
)
==
0
)
if
(
!
ops
->
init
||
ops
->
init
(
sch
,
NULL
)
==
0
)
return
sch
;
return
sch
;
qdisc_destroy
(
sch
);
errout:
errout:
return
NULL
;
return
NULL
;
}
}
...
...
net/sctp/proc.c
View file @
3f024c1a
...
@@ -57,6 +57,7 @@ static struct snmp_mib sctp_snmp_list[] = {
...
@@ -57,6 +57,7 @@ static struct snmp_mib sctp_snmp_list[] = {
SNMP_MIB_ITEM
(
"SctpReasmUsrMsgs"
,
SCTP_MIB_REASMUSRMSGS
),
SNMP_MIB_ITEM
(
"SctpReasmUsrMsgs"
,
SCTP_MIB_REASMUSRMSGS
),
SNMP_MIB_ITEM
(
"SctpOutSCTPPacks"
,
SCTP_MIB_OUTSCTPPACKS
),
SNMP_MIB_ITEM
(
"SctpOutSCTPPacks"
,
SCTP_MIB_OUTSCTPPACKS
),
SNMP_MIB_ITEM
(
"SctpInSCTPPacks"
,
SCTP_MIB_INSCTPPACKS
),
SNMP_MIB_ITEM
(
"SctpInSCTPPacks"
,
SCTP_MIB_INSCTPPACKS
),
SNMP_MIB_SENTINEL
};
};
/* Return the current value of a particular entry in the mib by adding its
/* Return the current value of a particular entry in the mib by adding its
...
...
net/sunrpc/auth_gss/gss_krb5_crypto.c
View file @
3f024c1a
...
@@ -185,9 +185,7 @@ make_checksum(s32 cksumtype, char *header, int hdrlen, struct xdr_buf *body,
...
@@ -185,9 +185,7 @@ make_checksum(s32 cksumtype, char *header, int hdrlen, struct xdr_buf *body,
sg
->
page
=
body
->
pages
[
i
];
sg
->
page
=
body
->
pages
[
i
];
sg
->
offset
=
offset
;
sg
->
offset
=
offset
;
sg
->
length
=
thislen
;
sg
->
length
=
thislen
;
kmap
(
sg
->
page
);
/* XXX kmap_atomic? */
crypto_digest_update
(
tfm
,
sg
,
1
);
crypto_digest_update
(
tfm
,
sg
,
1
);
kunmap
(
sg
->
page
);
len
-=
thislen
;
len
-=
thislen
;
i
++
;
i
++
;
offset
=
0
;
offset
=
0
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment