From 0464141ef5a06bfbcdb797c5a0b1b58dbd1775fd Mon Sep 17 00:00:00 2001 From: Chen Qi Date: Fri, 4 Jul 2014 16:50:04 +0800 Subject: populate-extfs.sh: fix to handle special file names correctly `debugfs' treats spaces and "" specially. So when we are dealing with file names, great care should be taken to make sure that `debugfs' recognizes file names correctly. The basic solution here is: 1. Use quotation marks to handle spaces correctly. 2. Replace "xxx" with ""xxx"" so that debugfs knows that the quotation marks are parts of the file name. [YOCTO #6503] Signed-off-by: Chen Qi --- .../e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh | 72 ++++++++++++++++------ 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh b/meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh index 47f5b5b237..a1808b3b3f 100644 --- a/meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh +++ b/meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh @@ -30,8 +30,41 @@ DEBUGFS="debugfs" DIR="$(dirname "$DIR")" + # debugfs handles the quotation mark differently from other special marks like { + # If FILE contains quotation marks in its name, then we have to replace " with "" + # so that debugfs could correclty recognize them. In this script, we use the prefix + # of D_ to denote the file names that should be used by debugfs. + # + # The usage of case statements here is to avoid performace impact. + case $FILE in + *\"*) + D_FILE="$(echo $FILE | sed -e 's#\"#\"\"#g')" + ;; + *) + D_FILE="$FILE" + ;; + esac + + case $DIR in + *\"*) + D_DIR="$(echo $DIR | sed -e 's#\"#\"\"#g')" + ;; + *) + D_DIR="$DIR" + ;; + esac + + case $TGT in + *\"*) + D_TGT="$(echo $TGT | sed -e 's#\"#\"\"#g')" + ;; + *) + D_TGT="$TGT" + ;; + esac + if [ "$DIR" != "$CWD" ]; then - echo "cd $DIR" + echo "cd \"$D_DIR\"" CWD="$DIR" fi @@ -41,23 +74,24 @@ DEBUGFS="debugfs" case $TYPE in "directory") - echo "mkdir $TGT" + echo "mkdir \"$D_TGT\"" ;; "regular file" | "regular empty file") - echo "write \"$FILE\" \"$TGT\"" + echo "write \"$D_FILE\" \"$D_TGT\"" ;; "symbolic link") LINK_TGT=$(readlink "$FILE") - echo "symlink \"$TGT\" \"$LINK_TGT\"" + D_LINK_TGT="$(echo $LINK_TGT | sed -e 's#\"#\"\"#g')" + echo "symlink \"$D_TGT\" \"$D_LINK_TGT\"" ;; "block special file") - echo "mknod \"$TGT\" b $DEVNO" + echo "mknod \"$D_TGT\" b $DEVNO" ;; "character special file") - echo "mknod \"$TGT\" c $DEVNO" + echo "mknod \"$D_TGT\" c $DEVNO" ;; "fifo") - echo "mknod \"$TGT\" p" + echo "mknod \"$D_TGT\" p" ;; *) echo "Unknown/unhandled file type '$TYPE' file: $FILE" 1>&2 @@ -65,19 +99,19 @@ DEBUGFS="debugfs" esac # Set the file mode - echo "sif \"$TGT\" mode 0x$MODE" + echo "sif \"$D_TGT\" mode 0x$MODE" # Set uid and gid - echo "sif \"$TGT\" uid $U" - echo "sif \"$TGT\" gid $G" + echo "sif \"$D_TGT\" uid $U" + echo "sif \"$D_TGT\" gid $G" # Set atime, mtime and ctime AT=`echo $AT | cut -d'.' -f1 | sed -e 's#[- :]##g'` MT=`echo $MT | cut -d'.' -f1 | sed -e 's#[- :]##g'` CT=`echo $CT | cut -d'.' -f1 | sed -e 's#[- :]##g'` - echo "sif \"$TGT\" atime $AT" - echo "sif \"$TGT\" mtime $MT" - echo "sif \"$TGT\" ctime $CT" + echo "sif \"$D_TGT\" atime $AT" + echo "sif \"$D_TGT\" mtime $MT" + echo "sif \"$D_TGT\" ctime $CT" done # Handle the hard links. @@ -91,15 +125,17 @@ DEBUGFS="debugfs" # Use the debugfs' ln and "sif links_count" to handle them. for i in `ls $INODE_DIR`; do # The link source - SRC=`head -1 $INODE_DIR/$i` + SRC="$(head -1 $INODE_DIR/$i)" + D_SRC="$(echo $SRC | sed -e 's#\"#\"\"#g')" # Remove the files and link them again except the first one - for TGT in `sed -n -e '1!p' $INODE_DIR/$i`; do - echo "rm $TGT" - echo "ln $SRC $TGT" + sed -n -e '1!p' $INODE_DIR/$i | while read TGT; do + D_TGT="$(echo $TGT | sed -e 's#\"#\"\"#g')" + echo "rm \"$D_TGT\"" + echo "ln \"$D_SRC\" \"$D_TGT\"" done LN_CNT=`cat $INODE_DIR/$i | wc -l` # Set the links count - echo "sif $SRC links_count $LN_CNT" + echo "sif \"$D_SRC\" links_count $LN_CNT" done rm -fr $INODE_DIR } | $DEBUGFS -w -f - $DEVICE 2>&1 1>/dev/null | grep '.*: .*' -- cgit 1.2.3-korg