Index: ObjFW.xcodeproj/project.pbxproj ================================================================== --- ObjFW.xcodeproj/project.pbxproj +++ ObjFW.xcodeproj/project.pbxproj @@ -243,11 +243,11 @@ ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "rm -fr $TARGET_BUILD_DIR/ObjFW.framework\nmkdir -p $TARGET_BUILD_DIR/ObjFW.framework/Versions/A/Headers || exit 1\nmkdir -p $TARGET_BUILD_DIR/ObjFW.framework/Versions/A/Resources || exit 1\ninstall -m 755 src/ObjFW $TARGET_BUILD_DIR/ObjFW.framework/Versions/A/ || exit 1\ninstall -m 644 src/*.h $TARGET_BUILD_DIR/ObjFW.framework/Versions/A/Headers/ || exit 1\ncat >$TARGET_BUILD_DIR/ObjFW.framework/Versions/A/Resources/Info.plist <<__EOF__\n\n\n\n\n\tCFBundleDevelopmentRegion\n\tEnglish\n\tCFBundleExecutable\n\tObjFW\n\tCFBundleGetInfoString\n\thttps://webkeks.org/hg/objfw\n\tCFBundleIdentifier\n\tObjFW\n\tCFBundleInfoDictionaryVersion\n\t6.0\n\tCFBundleName\n\tobjfw\n\tCFBundlePackageType\n\tFMWK\n\tCFBundleShortVersionString\n\t0.1\n\tCFBundleSignature\n\tOBJF\n\tCFBundleVersion\n\t0.1\n\n\n__EOF__\nif [ ! -f \"$TARGET_BUILD_DIR/ObjFW.framework/Versions/A/Resources/Info.plist\" ]; then\n\texit 1;\nfi\nln -s A $TARGET_BUILD_DIR/ObjFW.framework/Versions/Current || exit 1\nln -s Versions/Current/Headers $TARGET_BUILD_DIR/ObjFW.framework/Headers || exit 1\nln -s Versions/Current/Resources $TARGET_BUILD_DIR/ObjFW.framework/Resources || exit 1\nln -s Versions/Current/ObjFW $TARGET_BUILD_DIR/ObjFW.framework/ObjFW || exit 1"; + shellScript = "rm -fr $TARGET_BUILD_DIR/ObjFW.framework\nmkdir -p $TARGET_BUILD_DIR/ObjFW.framework/Versions/A/Headers || exit 1\nmkdir -p $TARGET_BUILD_DIR/ObjFW.framework/Versions/A/Resources || exit 1\ninstall -m 755 src/ObjFW $TARGET_BUILD_DIR/ObjFW.framework/Versions/A/ || exit 1\ninstall -m 644 src/*.h $TARGET_BUILD_DIR/ObjFW.framework/Versions/A/Headers/ || exit 1\ncat >$TARGET_BUILD_DIR/ObjFW.framework/Versions/A/Resources/Info.plist <<__EOF__\n\n\n\n\n\tCFBundleDevelopmentRegion\n\tEnglish\n\tCFBundleExecutable\n\tObjFW\n\tCFBundleGetInfoString\n\thttps://webkeks.org/objfw\n\tCFBundleIdentifier\n\tObjFW\n\tCFBundleInfoDictionaryVersion\n\t6.0\n\tCFBundleName\n\tobjfw\n\tCFBundlePackageType\n\tFMWK\n\tCFBundleShortVersionString\n\t0.1\n\tCFBundleSignature\n\tOBJF\n\tCFBundleVersion\n\t0.1\n\n\n__EOF__\nif [ ! -f \"$TARGET_BUILD_DIR/ObjFW.framework/Versions/A/Resources/Info.plist\" ]; then\n\texit 1;\nfi\nln -s A $TARGET_BUILD_DIR/ObjFW.framework/Versions/Current || exit 1\nln -s Versions/Current/Headers $TARGET_BUILD_DIR/ObjFW.framework/Headers || exit 1\nln -s Versions/Current/Resources $TARGET_BUILD_DIR/ObjFW.framework/Resources || exit 1\nln -s Versions/Current/ObjFW $TARGET_BUILD_DIR/ObjFW.framework/ObjFW || exit 1"; }; 4B5D8DE11099E1BF000896FF /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( Index: src/OFMutableArray.m ================================================================== --- src/OFMutableArray.m +++ src/OFMutableArray.m @@ -110,10 +110,22 @@ for (i = 0; i < count; i++) { if ([objs[i] isEqual: obj]) { OFObject *obj = objs[i]; [array removeItemAtIndex: i]; [obj release]; + + /* + * We need to get the C array again as it might have + * been relocated. We also need to adjust the count + * as otherwise we would have an out of bounds access. + * As another object will be at the current index now, + * we also need to handle the same index again, thus we + * decrease it. + */ + objs = [array cArray]; + count--; + i--; } } return self; } @@ -125,10 +137,22 @@ for (i = 0; i < count; i++) { if (objs[i] == obj) { [array removeItemAtIndex: i]; [obj release]; + + /* + * We need to get the C array again as it might have + * been relocated. We also need to adjust the count + * as otherwise we would have an out of bounds access. + * As another object will be at the current index now, + * we also need to handle the same index again, thus we + * decrease it. + */ + objs = [array cArray]; + count--; + i--; } } return self; }