Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
3cbf97be
Unverified
提交
3cbf97be
authored
3月 23, 2018
作者:
Whyrusleeping
提交者:
GitHub
3月 23, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #4792 from ipfs/fix/read-eof
fix incorrect Read calls
上级
54970e0c
a8645afb
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
46 行增加
和
55 行删除
+46
-55
util.go
cmd/seccat/util.go
+1
-1
fsrepo.go
repo/fsrepo/fsrepo.go
+12
-4
pbdagreader.go
unixfs/io/pbdagreader.go
+9
-11
dagmodifier.go
unixfs/mod/dagmodifier.go
+24
-39
没有找到文件。
cmd/seccat/util.go
浏览文件 @
3cbf97be
...
...
@@ -31,7 +31,7 @@ type logRW struct {
func
(
r
*
logRW
)
Read
(
buf
[]
byte
)
(
int
,
error
)
{
n
,
err
:=
r
.
rw
.
Read
(
buf
)
if
err
==
nil
{
if
n
>
0
{
log
.
Debugf
(
"%s read: %v"
,
r
.
n
,
buf
)
}
return
n
,
err
...
...
repo/fsrepo/fsrepo.go
浏览文件 @
3cbf97be
...
...
@@ -324,13 +324,21 @@ func APIAddr(repoPath string) (ma.Multiaddr, error) {
// read up to 2048 bytes. io.ReadAll is a vulnerability, as
// someone could hose the process by putting a massive file there.
buf
:=
make
([]
byte
,
2048
)
n
,
err
:=
f
.
Read
(
buf
)
if
err
!=
nil
&&
err
!=
io
.
EOF
{
//
// NOTE(@stebalien): @jbenet probably wasn't thinking straight when he
// wrote that comment but I'm leaving the limit here in case there was
// some hidden wisdom. However, I'm fixing it such that:
// 1. We don't read too little.
// 2. We don't truncate and succeed.
buf
,
err
:=
ioutil
.
ReadAll
(
io
.
LimitReader
(
f
,
2048
))
if
err
!=
nil
{
return
nil
,
err
}
if
len
(
buf
)
==
2048
{
return
nil
,
fmt
.
Errorf
(
"API file too large, must be <2048 bytes long: %s"
,
apiFilePath
)
}
s
:=
string
(
buf
[
:
n
]
)
s
:=
string
(
buf
)
s
=
strings
.
TrimSpace
(
s
)
return
ma
.
NewMultiaddr
(
s
)
}
...
...
unixfs/io/pbdagreader.go
浏览文件 @
3cbf97be
...
...
@@ -166,22 +166,20 @@ func (dr *PBDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) {
total
:=
0
for
{
// Attempt to fill bytes from cached buffer
n
,
err
:=
dr
.
buf
.
Read
(
b
[
total
:
])
n
,
err
:=
io
.
ReadFull
(
dr
.
buf
,
b
[
total
:
])
total
+=
n
dr
.
offset
+=
int64
(
n
)
if
err
!=
nil
{
// EOF is expected
if
err
!=
io
.
EOF
{
return
total
,
err
}
}
// If weve read enough bytes, return
if
total
==
len
(
b
)
{
switch
err
{
// io.EOF will happen is dr.buf had noting more to read (n == 0)
case
io
.
EOF
,
io
.
ErrUnexpectedEOF
:
// do nothing
case
nil
:
return
total
,
nil
default
:
return
total
,
err
}
//
Otherwise, load up the
next block
//
if we are not done with the output buffer load
next block
err
=
dr
.
precalcNextBuf
(
ctx
)
if
err
!=
nil
{
return
total
,
err
...
...
unixfs/mod/dagmodifier.go
浏览文件 @
3cbf97be
...
...
@@ -202,7 +202,7 @@ func (dm *DagModifier) Sync() error {
buflen
:=
dm
.
wrBuf
.
Len
()
// overwrite existing dag nodes
thisc
,
done
,
err
:=
dm
.
modifyDag
(
dm
.
curNode
,
dm
.
writeStart
,
dm
.
wrBuf
)
thisc
,
err
:=
dm
.
modifyDag
(
dm
.
curNode
,
dm
.
writeStart
)
if
err
!=
nil
{
return
err
}
...
...
@@ -213,7 +213,7 @@ func (dm *DagModifier) Sync() error {
}
// need to write past end of current dag
if
!
done
{
if
dm
.
wrBuf
.
Len
()
>
0
{
dm
.
curNode
,
err
=
dm
.
appendData
(
dm
.
curNode
,
dm
.
splitter
(
dm
.
wrBuf
))
if
err
!=
nil
{
return
err
...
...
@@ -231,28 +231,27 @@ func (dm *DagModifier) Sync() error {
return
nil
}
// modifyDag writes the data in 'data' over the data in 'node' starting at 'offset'
// returns the new key of the passed in node and whether or not all the data in the reader
// has been consumed.
func
(
dm
*
DagModifier
)
modifyDag
(
n
ipld
.
Node
,
offset
uint64
,
data
io
.
Reader
)
(
*
cid
.
Cid
,
bool
,
error
)
{
// modifyDag writes the data in 'dm.wrBuf' over the data in 'node' starting at 'offset'
// returns the new key of the passed in node.
func
(
dm
*
DagModifier
)
modifyDag
(
n
ipld
.
Node
,
offset
uint64
)
(
*
cid
.
Cid
,
error
)
{
// If we've reached a leaf node.
if
len
(
n
.
Links
())
==
0
{
switch
nd0
:=
n
.
(
type
)
{
case
*
mdag
.
ProtoNode
:
f
,
err
:=
ft
.
FromBytes
(
nd0
.
Data
())
if
err
!=
nil
{
return
nil
,
false
,
err
return
nil
,
err
}
n
,
err
:=
data
.
Read
(
f
.
Data
[
offset
:
])
_
,
err
=
dm
.
wrBuf
.
Read
(
f
.
Data
[
offset
:
])
if
err
!=
nil
&&
err
!=
io
.
EOF
{
return
nil
,
false
,
err
return
nil
,
err
}
// Update newly written node..
b
,
err
:=
proto
.
Marshal
(
f
)
if
err
!=
nil
{
return
nil
,
false
,
err
return
nil
,
err
}
nd
:=
new
(
mdag
.
ProtoNode
)
...
...
@@ -260,16 +259,10 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
nd
.
SetPrefix
(
&
nd0
.
Prefix
)
err
=
dm
.
dagserv
.
Add
(
dm
.
ctx
,
nd
)
if
err
!=
nil
{
return
nil
,
false
,
err
}
// Hey look! we're done!
var
done
bool
if
n
<
len
(
f
.
Data
[
offset
:
])
{
done
=
true
return
nil
,
err
}
return
nd
.
Cid
(),
done
,
nil
return
nd
.
Cid
(),
nil
case
*
mdag
.
RawNode
:
origData
:=
nd0
.
RawData
()
bytes
:=
make
([]
byte
,
len
(
origData
))
...
...
@@ -278,9 +271,9 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
copy
(
bytes
,
origData
[
:
offset
])
// copy in new data
n
,
err
:=
d
ata
.
Read
(
bytes
[
offset
:
])
n
,
err
:=
d
m
.
wrBuf
.
Read
(
bytes
[
offset
:
])
if
err
!=
nil
&&
err
!=
io
.
EOF
{
return
nil
,
false
,
err
return
nil
,
err
}
// copy remaining data
...
...
@@ -291,46 +284,39 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
nd
,
err
:=
mdag
.
NewRawNodeWPrefix
(
bytes
,
nd0
.
Cid
()
.
Prefix
())
if
err
!=
nil
{
return
nil
,
false
,
err
return
nil
,
err
}
err
=
dm
.
dagserv
.
Add
(
dm
.
ctx
,
nd
)
if
err
!=
nil
{
return
nil
,
false
,
err
}
// Hey look! we're done!
var
done
bool
if
n
<
len
(
bytes
[
offset
:
])
{
done
=
true
return
nil
,
err
}
return
nd
.
Cid
(),
done
,
nil
return
nd
.
Cid
(),
nil
}
}
node
,
ok
:=
n
.
(
*
mdag
.
ProtoNode
)
if
!
ok
{
return
nil
,
false
,
ErrNotUnixfs
return
nil
,
ErrNotUnixfs
}
f
,
err
:=
ft
.
FromBytes
(
node
.
Data
())
if
err
!=
nil
{
return
nil
,
false
,
err
return
nil
,
err
}
var
cur
uint64
var
done
bool
for
i
,
bs
:=
range
f
.
GetBlocksizes
()
{
// We found the correct child to write into
if
cur
+
bs
>
offset
{
child
,
err
:=
node
.
Links
()[
i
]
.
GetNode
(
dm
.
ctx
,
dm
.
dagserv
)
if
err
!=
nil
{
return
nil
,
false
,
err
return
nil
,
err
}
k
,
sdone
,
err
:=
dm
.
modifyDag
(
child
,
offset
-
cur
,
data
)
k
,
err
:=
dm
.
modifyDag
(
child
,
offset
-
cur
)
if
err
!=
nil
{
return
nil
,
false
,
err
return
nil
,
err
}
node
.
Links
()[
i
]
.
Cid
=
k
...
...
@@ -338,12 +324,11 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
// Recache serialized node
_
,
err
=
node
.
EncodeProtobuf
(
true
)
if
err
!=
nil
{
return
nil
,
false
,
err
return
nil
,
err
}
if
sdone
{
if
dm
.
wrBuf
.
Len
()
==
0
{
// No more bytes to write!
done
=
true
break
}
offset
=
cur
+
bs
...
...
@@ -352,7 +337,7 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
}
err
=
dm
.
dagserv
.
Add
(
dm
.
ctx
,
node
)
return
node
.
Cid
(),
done
,
err
return
node
.
Cid
(),
err
}
// appendData appends the blocks from the given chan to the end of this dag
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论