Skip to contentSkip to conversation

populate-extfs.sh: fix to handle special file names correctly

PATCH In review Chen Qi 3 participants 4 messages Jul 8, 2014

lore
Share & tools
lore

Chen Qi

author
#0 lore raw

cover populate-extfs.sh: fix to handle special file names correctly

The following changes since commit 330c3085317a0b0981163ff5c41c54596e0d127d:

libtool-cross/native: Force usage of bash due to sstate inconsistencies (2014-07-03 14:55:42 +0100)

are available in the git repository at:

git://git.openembedded.org/openembedded-core-contrib ChenQi/dora-populate-extfs
http://cgit.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h=ChenQi/dora-populate-extfs

Chen Qi (1):
populate-extfs.sh: fix to handle special file names correctly

 .../e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh   |   72 +++++++++++++++-----
 1 file changed, 54 insertions(+), 18 deletions(-)
Signature · 1 line
1.7.9.5
author
#1 lore raw

PATCH 1/1 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]

---
 .../e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh   |   72 +++++++++++++++-----
 1 file changed, 54 insertions(+), 18 deletions(-)
meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh +54 -18
index 47f5b5b..a1808b3 100644
@@ -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 '.*: .*'
Signature · 1 line
1.7.9.5
#2 lore raw
Quoted 11 lines · Chen Qi

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]

Do you mean for this to be for Dora? The populate-extfs has now been merged into the upstream code and not a patch.

Can you work with Robert to ensure it gets upstreamed and into dora if that's the right target. There was another older patchset that you also sent that falls in this came category, I want to ensure we get these fixes into the upstream e2fsprogs and patched correctly in master and daisy if needed.

Thanks
Sau!

Quoted 133 lines
---
  .../e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh   |   72 +++++++++++++++-----
  1 file changed, 54 insertions(+), 18 deletions(-)
meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh +54 -18
index 47f5b5b..a1808b3 100644
@@ -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 '.*: .*'
#3 lore raw
Quoted 10 lines · Saul Wold
Quoted 9 lines · Chen Qi

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.

Quoted 4 lines
Quoted 2 lines

[YOCTO #6503]

Do you mean for this to be for Dora? The populate-extfs has now been merged into the upstream code and not a patch.

Yes, it is for dora only, daisy or master doesn't use the populate-extfs.sh any more. I will talk with Qi to send it to e2fsprogs's upstream, but it is a block issue for 1.5.3 atm. The problem was that it can't handle the filename with quotation marks in the past, and this patch fix the problem.

// Robert

Quoted 150 lines

Can you work with Robert to ensure it gets upstreamed and into dora if that's the right target. There was another older patchset that you also sent that falls in this came category, I want to ensure we get these fixes into the upstream e2fsprogs and patched correctly in master and daisy if needed.

Thanks
Sau!

Quoted 139 lines
---
  .../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 47f5b5b..a1808b3 100644

meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh +2 -0
@@ -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

meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh +3 -0
+                # of D_ to denote the file names that should be used by debugfs.
+                #
+                # The usage of case statements here is to avoid performace

impact.

meta/recipes-devtools/e2fsprogs/e2fsprogs-1.42.8/populate-extfs.sh +48 -18
+                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 '.*: .*'