読者です 読者をやめる 読者になる 読者になる

libcgroup-0.40.rc1-5.el6_5.1.x86_64 の template 記法のバグ の続き

http://d.hatena.ne.jp/hiboma/20140406/1396715760 の続きです

git リポジトリからバグを探す

git clone git://git.code.sf.net/p/libcg/libcg してバグが修正されたコミットを探していました。
どうやら下記のコミットで修正されたようです (このコミットの前後で serverspec の挙動が変わる)

  • tempalte の記法で %u %g %p と大文字の %U %G %P のフォーマットが使えるのだが
  • それぞれが逆に取り違えて実装されていた ...
commit 83248a9edad920e1ceb879bc26ef155a9554617c
Author: Peter Schiffer <pschiffe@redhat.com>
Date:   Mon Oct 14 08:43:24 2013 +0200

    Templates letter case is switched
    
    Man page cgrules.conf(5) says:
         %u     username, uid if name resolving fails
         %U     uid
         %g     group name, gid if name resolving fails
         %G     gid
         %p     process name, pid if name not available
         %P     pid
    
    However, in cgroup_change_cgroup_flags() function, the letter case is switched.
    This patch fixes the problem.
    
    Signed-off-by: Peter Schiffer <pschiffe@redhat.com>
    Acked-by: Ivana Hutarova Varekova <varekova@redhat.com>

diff --git a/src/api.c b/src/api.c
index ba97768..38314fb 100644
--- a/src/api.c
+++ b/src/api.c
@@ -2933,11 +2933,11 @@ int cgroup_change_cgroup_flags(uid_t uid, gid_t gid,
 				available = FILENAME_MAX - j - 2;
 				/* Substitution */
 				switch(tmp->destination[++i]) {
-				case 'u':
+				case 'U':
 					written = snprintf(newdest+j, available,
 						"%d", uid);
 					break;
-				case 'U':
+				case 'u':
 					user_info = getpwuid(uid);
 					if(user_info) {
 						written = snprintf(newdest + j,
@@ -2948,11 +2948,11 @@ int cgroup_change_cgroup_flags(uid_t uid, gid_t gid,
 							available, "%d", uid);
 					}
 					break;
-				case 'g':
+				case 'G':
 					written = snprintf(newdest + j,
 						available, "%d", gid);
 					break;
-				case 'G':
+				case 'g':
 					group_info = getgrgid(gid);
 					if(group_info) {
 						written = snprintf(newdest + j,
@@ -2963,11 +2963,11 @@ int cgroup_change_cgroup_flags(uid_t uid, gid_t gid,
 							available, "%d", gid);
 					}
 					break;
-				case 'p':
+				case 'P':
 					written = snprintf(newdest + j,
 						available, "%d", pid);
 					break;
-				case 'P':
+				case 'p':
 					if(procname) {
 						written = snprintf(newdest + j,
 							available, "%s",

単純だけど厄介なバグですね